PHP检查两个日期时间是否在同一日历日

时间:2016-01-21 09:53:48

标签: php date datetime

我有两个像这样的日期时间(日期实际上是$ vars)

$startTime = \DateTime::createFromFormat('Y/m/d H:i', '2015/01/01 23:00');
$endTime = \DateTime::createFromFormat('Y/m/d H:i', '2015/01/02 01:00');

我为一个(可能很漂亮的)简单问题而苦苦挣扎:我怎样才能确定这两个日期是否在不同的日历日?

我不能<因为2015/01/01 22:00 < 2015/01/01 23:00也是如此。我也不能这样做:

$diff = $startTime->diff($endTime);
$days = $diff->format('%d');

echo $days;

因为它给了我0

THIS让我知道如何做到这一点,但对于javascript,什么是PHP的等价物?

// UPDATE

    $startDate = $startTime->format('Y/m/d');
    $endDate = $endTime->format('Y/m/d');
    $diffDates = $startDate->diff($endDate);
    $daysDiff = $diffDates->format('%d');

    echo $daysDiff;

我认为现在可能是正确的方法,感谢评论,但现在我得到Error: Call to a member function diff() on string

//澄清我想做什么

我只是希望在天数上有所不同,所以对于上述情况,它将是'1'(实际上只有2小时差异),例如'2015/01/01 23:00' and '2015/01/03 17:00'将是'2'。< / p>

3 个答案:

答案 0 :(得分:3)

我认为这是使用字符串进行日期计算的少数情况之一:

function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){
    return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d');
}

此代码应易于扩展以包含时区。

还有其他选择,但我认为他们通常不值得付出努力:

  1. 逐个元素比较(日,月和年):

    • PHP DateTime类不提供专用功能,仅提供format()
  2. 将两个日期标准化为公共时间并与==(不是===)进行比较:

    • 除非您使用不可变对象,否则您需要克隆输入或预期副作用

    • 您还需要确保活动时区中存在时间,尽管午夜可能足够安全。

  3. 无论如何,YMMV; - )

答案 1 :(得分:2)

只需创建时间设置为00:00:00的日期:

$startTime = \DateTime::createFromFormat('Y/m/d H:i:s', '2015/01/01 00:00:00');
$endTime = \DateTime::createFromFormat('Y/m/d H:i:s', '2015/01/02 00:00:00');

或在现有日期将时间重置为零:

$startTime->setTime(0, 0, 0);
$endTime->setTime(0, 0, 0);

然后它应该工作:

$diff = $startTime->diff($endTime);
$days = $diff->format('%d');

echo $days; // 1

<强>加成

如果您只想使用日期,请记住将时间设置为createFromFormat中的00:00:00或使用setTime重置时间。如果您不能在createFromFormat中提供时间,PHP会将其设置为当前时间:

$date = DateTime::createFromFormat('Y-m-d', '2016-01-21');
print $date->format('H:i:s'); //not 00:00:00

要解决此问题,您必须:

  • 以格式提供00:00:00时间:

    $date = DateTime::createFromFormat('Y-m-d H:i:s', '2016-01-21 00:00:00');

  • 在日期格式前加上感叹号并省略时间,这会自动将时间设置为00:00:00:

    $date = DateTime::createFromFormat('!Y-m-d', '2016-01-21');

  • 重置创建后的时间:

    $date = DateTime::createFromFormat('Y-m-d', '2016-01-21'); $date->setTime(0, 0);

答案 2 :(得分:0)

比较格式化的日期是正确的事情:

$a->format('Y-m-d') === $b->format('Y-m-d')

如果使用Carbon,有一种解决方法:

$dt1->isSameDay($dt2)

因此,我建议使用它代替此处给出的先前答案。

http://carbondoc/docs/#api-comparison