Search code examples
phpdatetimedate-formattime-format

PHP date_create / date_diff only works with american date-format?


So I have two form fields containing dates.

Using jQuery-UI Datepicker, I set their format do dd/mm/yy.

I use a function that return me the days between two dates:

function getDaysBetween($date1, $date2){
    $datetime1 = date_create($date1);
    $datetime2 = date_create($date2);
    $interval = date_diff($datetime1, $datetime2);
    return $interval->days;
}

I alert the value afterwards for debugging purposes.

So, If my date is in dd/mm/yy format, php returns the following for startdate = 01/04/2016 and enddate = 03/04/2016.

enter image description here

If my dates are in mm/dd/yy format however, it is correctly:

enter image description here

Why?


Solution

  • You should use DateTime::createFromFormat instead of date_create().

    So, modify your getDaysBetween() function like this :

    function getDaysBetween($date1, $date2, $format = 'd-m-Y'){
        $datetime1 = DateTime::createFromFormat($format, $date1);
        $datetime2 = DateTime::createFromFormat($format, $date2);
        $interval = date_diff($datetime1, $datetime2);
        return $interval->days;
    }
    

    Then, you can use that function like this for dates formatted as d-m-Y :

    getDaysBetween('01-02-2016', '01-04-2016')); // -> OUTPUTS int(60)
    

    If your input is in a format different from d-m-Y, just pass along the format as an extra parameter.

    Some examples :

    getDaysBetween('3-2-2016', '15-5-2016', 'j-n-Y'); // -> OUTPUTS int(102)
    
    
    getDaysBetween('9-Dec-2015', '28-Mar-2015', 'j-M-Y'); // -> OUTPUTS int(256)
    
    
    getDaysBetween('15/8/24', '15/11/18', 'y/m/d'); // -> OUTPUTS int(86)
    

    See the documentation for an overview of the supported formats.