Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate date format in php

I'm trying to validate date using PHP.

I'd like following formats to be valid:

d/m/yy
d/m/yyyy
dd/m/yy
dd/m/yyyy
d/mm/yy
d/mm/yyyy
dd/mm/yy
dd/mm/yyyy

I've tried many regular expressions and different variations of checkdate() function. Currently I have something like this:

function _date_is_valid($str)
{
     if(strlen($str) == 0)
         return TRUE;
     if(substr_count($str,'/') == 2)
     {
         if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str))
         {
             $datearray = explode('/',$str);
             if($datearray[2] > 2030)
                 return FALSE;
             return checkdate($datearray[1], $datearray[0], $datearray[2]);
         } 
         else 
         {
             return FALSE;
         }
     }
     return FALSE;
}

This however, validates dates like 11/11/200 and 11/11/200#

How can I validate date to match required format?

Edit: I could check datearray[2] to be between 10 and 30 and 2010 and 2030. But is there a way to check it using regex?

Edit1: return TRUE on strlen($str) == 0 is because I want users to be able to add events without knowing when will the event occur so someone else can qualify the schedule and assign event to certain date later


Just for the record. I ended up doing:

function _date_is_valid($str)
{
    if(strlen($str) == 0) //To accept entries without a date
        return TRUE;
    if(substr_count($str,'/') == 2)
    {
        list($d,$m,$y) = explode('/',$str);
        if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030))
        {
            return checkdate($m,$d,$y);
        }
    }
    return FALSE;
}

Thanks for all your answers

like image 308
LukeP Avatar asked Jan 18 '10 14:01

LukeP


People also ask

How check date format is valid or not in PHP?

PHP checkdate() Functionvar_dump(checkdate(12,31,-400));

What is Checkdate function in PHP?

The checkdate() function is a built-in function in PHP which checks the validity of the date passed in the arguments. It accepts the date in the format mm/dd/yyyy. The function returns a boolean value. It returns true if the date is a valid one, else it returns false. Syntax: checkdate ( $month, $day, $year )


4 Answers

function _date_is_valid($str) {
    if (substr_count($str, '/') == 2) {
        list($d, $m, $y) = explode('/', $str);
        return checkdate($m, $d, sprintf('%04u', $y));
    }

    return false;
}
like image 81
Alix Axel Avatar answered Oct 04 '22 03:10

Alix Axel


If it will always will be date / month / year you can use checkdate:

function _date_is_valid($str)
{
    $array = explode('/', $str);

    $day = $array[0];
    $month = $array[1];
    $year = $array[2];

    $isDateValid = checkdate($month, $day, $year);
    return $isDateValid;
}
like image 21
ahmetunal Avatar answered Oct 04 '22 04:10

ahmetunal


an easy way to do this

<?php
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar))
like image 29
Rami Jamleh Avatar answered Oct 04 '22 04:10

Rami Jamleh


Try this:

function _date_is_valid($str) {
    if (strlen($str) == 0) {
        return TRUE;
    }
    return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030;
}
like image 33
Gumbo Avatar answered Oct 04 '22 05:10

Gumbo