Validate date format in php

16,794

Solution 1

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;
}

Solution 2

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;
}

Solution 3

an easy way to do this

<?php
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar))

Solution 4

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;
}

Solution 5

What I did to validate it was simple

    function dateValidate($pDate) {
    if(empty($pDate)) 
        return true; 
    $chDate = date('Y-m-d', strtotime($pDate));
    if($chDate != '1970-01-01')
        return true;
    else 
        return false;
}

You can find it out with using regexp too

Share:
16,794
LukeP
Author by

LukeP

Not sure what to say

Updated on June 27, 2022

Comments

  • LukeP
    LukeP almost 2 years

    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