$new_date = date('Y-m-d', strtotime("+2 days"));
或
$new_date = date('Y-m-d', strtotime("+48 hours"));
它们相同还是不同
答案 0 :(得分:2)
它们相同还是不同
它们是完全不同的。 客观地说,两天并不总是等于48小时。
考虑越过夏令时边界。
例如,2019-04-07T02:00:00+1100
(AEDT-> AEST)
$twoDays = new DateInterval('P2D');
$fortyEightHours = new DateInterval('PT48H');
$ref = new DateTimeImmutable('2019-04-07T01:00:00',
new DateTimeZone('Australia/Melbourne'));
echo 'Reference: ', $ref->format('r'), PHP_EOL;
echo 'Plus 2 days: ', $ref->add($twoDays)->format('r'), PHP_EOL;
echo 'Plus 48 hours: ', $ref->add($fortyEightHours)->format('r'), PHP_EOL;
这产生
Reference: Sun, 07 Apr 2019 01:00:00 +1100
Plus 2 days: Tue, 09 Apr 2019 01:00:00 +1000
Plus 48 hours: Tue, 09 Apr 2019 00:00:00 +1000
注意,HHVM由于某种原因会产生不同的结果
此常见的与日期/时间相关的虚假列表值得一看〜https://github.com/kdeldycke/awesome-falsehood#dates-and-time
值得指出的是,使用相同的参考日期并用strtotime()
进行操作会产生与上述不同的结果。
我怀疑这是因为其相对时间计算不如DateInterval
那样细致。
答案 1 :(得分:0)
在语义上,它们是不同的,如Phil在另一个答案中所证明。这意味着在其他一些导致此问题的库中,差异是真实的。
但是,strtotime()的实现并未考虑到这一点,因此,以您的示例为例,它没有任何区别。
我很感兴趣是否可以通过源代码进行后续操作,所以去了:
strtotime()的实现是这样的:
+2 days
或+48 hours
。do_range_limit(0, 24, 24, &time->h, &time->d)
,如果小时数超出硬编码限制(24),则增加天数,并减少小时数;如果do_range_limit_days()的天数则为+48 hours
,如果我们超过硬编码的限制数天,则减少数天超过了限制,并考虑了跳跃时间(但没有时区!)。+2 days
还是{{1 }}。因此,没有区别。TLDR:strtotime()在进行转换时不会考虑时区,因此在该函数中,即使确实如此,它也没有区别。