PHP date_create / date_diff仅适用于美国日期格式?

时间:2016-04-01 17:49:22

标签: php date time date-format time-format

所以我有两个包含日期的表单字段。

使用jQuery-UI Datepicker,我将其格式设置为dd/mm/yy

我使用的函数可以返回两个日期之间的日期:

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

我在事后警告该值以进行调试。

所以,如果我的日期是dd / mm / yy格式,php会为startdate = 01/04/2016和enddate = 03/04/2016返回以下内容。

enter image description here

如果我的日期是mm / dd / yy格式,那么它是正确的:

enter image description here

为什么?

2 个答案:

答案 0 :(得分:2)

您应该使用DateTime::createFromFormat代替date_create()

因此,请修改getDaysBetween()函数,如下所示:

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

然后,您可以将此功能用于格式为d-m-Y的日期:

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

如果您的输入格式与d-m-Y不同,则只需将格式作为额外参数传递。

一些例子:

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)

有关支持的格式的概述,请参阅the documentation

答案 1 :(得分:0)

您应该使用日期" YYYY-MM-DD"无论如何,在您的数据库中,您可以请求按日期排序。所以你只需要设置你的时区并使用date_diff。如果你想像MM-DD-YYYY那样输出它们,只需使用

<?php
date_default_timezone_set('America/Montreal');

$date_a = new DateTime('2016-02-01');
$date_b = new DateTime('2016-04-01');

$interval = date_diff($date_a, $date_b);

echo $interval->format('%d');

echo date('m-d-Y', strtotime('2016-02-01'));