PHP检查两个日期时间是否不在同一日历日
我有两次这样的约会(日期实际上是$vars) 我面临一个(可能相当)简单的问题:如何确定这两个日期是否在不同的日历日PHP检查两个日期时间是否不在同一日历日,php,date,datetime,Php,Date,Datetime,我有两次这样的约会(日期实际上是$vars) 我面临一个(可能相当)简单的问题:如何确定这两个日期是否在不同的日历日 我不能我认为这是使用字符串进行日期计算的少数情况之一: function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){ return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d'); }
我不能
我认为这是使用字符串进行日期计算的少数情况之一:
function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){
return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d');
}
此代码应易于扩展,以包括时区
还有其他选择,但我认为它们通常不值得付出努力:
按元素进行比较(日、月和年):
- PHP
DateTime
类不提供专用函数,只提供format()
将两个日期标准化为一个公共时间,并与=
进行比较(而不是==
):
- 除非您使用的是不可变对象,否则您需要克隆输入或预期副作用
- 您还需要确保活动时区中存在时间,尽管午夜可能足够安全
不管怎样,YMMV;-) 只需创建时间设置为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中提供时间,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-dh: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)代码>
比较格式化日期是正确的做法:
$a->format('Y-m-d') === $b->format('Y-m-d')
如果使用碳,则有一种方法:
$dt1->isSameDay($dt2)
所以我建议用它来代替前面给出的答案
为什么不使用类似于Y-m-d
的格式对它们进行格式化并进行比较呢?你到底想做什么?我希望上面的例子给出1,因为这意味着这些日期时间之间有一天$isSameCalendarDay=$d1->format('Y-m-d')=====$d2->format('Y-m-d')
?你需要使用diff()
在DateTime
对象上,不是由format()
生成的字符串。这几乎就是我想要的,但我需要的不是真/假,而是天数,因此2015/01/01 08:00和2015/01/03 17:00将输出2。但我想我自己能弄明白,所以谢谢你!好吧,我不知道你需要什么,但这是你实际上问的:-?setTime
是我缺少的。谢谢值得注意的是,由于我们不再使用原始时间,计算出的差异不是真实的。你能链接该方法的文档吗?我找不到它。比较部分$dt->isSameDay($dt2);//同年同月同日
这是一个古老的答案,我认为之前的问题中有一个“碳”标签,但不确定。
$date = DateTime::createFromFormat('Y-m-d', '2016-01-21');
print $date->format('H:i:s'); //not 00:00:00
$a->format('Y-m-d') === $b->format('Y-m-d')
$dt1->isSameDay($dt2)