【问题标题】:PHP check if two Datetimes are not on the same calendar dayPHP检查两个日期时间是否不在同一日历日
【发布时间】:2016-01-21 09:53:47
【问题描述】:

我有两个这样的日期时间(日期实际上是 $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 的等价物是什么?

//更新

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

    echo $daysDiff;

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

//更新以澄清我正在尝试做的事情

我只是想以天为单位,所以对于上述情况,它将是 '1'(尽管实际上只有 2 小时的差异),例如 '2015/01/01 23:00' and '2015/01/03 17:00' 将是 '2'

【问题讨论】:

  • 为什么不直接使用Y-m-d 之类的格式对它们进行格式化并进行比较?
  • 你到底想做什么?
  • 我希望上面的例子给出 1 作为结果,因为这意味着这些日期时间之间有一天
  • $isSameCalendarDay = $d1->format('Y-m-d') === $d2->format('Y-m-d')?
  • 您需要在DateTime 对象上使用diff(),而不是format() 产生的字符串。

标签: php date datetime


【解决方案1】:

比较格式化的日期是正确的做法:

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

如果你使用 Carbon,有一个方法:

$dt1->isSameDay($dt2)

所以我建议使用它而不是之前给出的答案。

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

【讨论】:

  • 你能链接那个方法的文档吗?我找不到它。
  • 比较部分$dt->isSameDay($dt2); // Same day of same month of same year
  • 这是一个旧答案,我认为之前的问题中有一个“碳”标签,但不确定。
【解决方案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);

【讨论】:

  • setTime 是我所缺少的。谢谢!
  • 值得注意的是,计算出的差异不是真实的,因为我们不再使用原始时间。
【解决方案3】:

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

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

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

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

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

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

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

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

无论如何,YMMV ;-)

【讨论】:

  • 这几乎是我要找的,但不是真/假,我需要天数,所以 2015/01/01 08:00 和 2015/01/03 17:00 会输出 2。但我认为我可以自己解决这个问题,所以到目前为止谢谢!
  • 好吧,我不知道你需要什么,但这是你实际问的:-?
猜你喜欢
  • 2023-03-07
  • 2010-09-06
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多