我有两个像这样的日期时间(日期实际上是$ 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>
答案 0 :(得分:3)
我认为这是使用字符串进行日期计算的少数情况之一:
function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){
return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d');
}
此代码应易于扩展以包含时区。
还有其他选择,但我认为他们通常不值得付出努力:
逐个元素比较(日,月和年):
DateTime
类不提供专用功能,仅提供format()
。将两个日期标准化为公共时间并与==
(不是===
)进行比较:
除非您使用不可变对象,否则您需要克隆输入或预期副作用
您还需要确保活动时区中存在时间,尽管午夜可能足够安全。
无论如何,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)
因此,我建议使用它代替此处给出的先前答案。