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

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

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

使用 jQuery-UI 日期选择器,我将它们的格式设置为 dd/mm/yy.

我使用一个函数 return 我计算两个日期之间的天数:

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

出于调试目的,我之后会提醒该值。

所以,如果我的日期是 dd/mm/yy 格式,php return 开始日期 = 01/04/2016 和结束日期 = 03/04/2016。

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

为什么?

无论如何,您都应该在数据库中使用日期 "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'));

您应该使用 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