$new_date = date('Y-m-d', strtotime("+2 days"));
或者
$new_date = date('Y-m-d', strtotime("+48 hours"));
他们是相同的还是不同的。
它们是相同的还是不同的
它们是非常不同的。 客观地说,两天并不总是等于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
那么微妙。
从语义上讲,正如Phil在另一个答案中所示,它们是不同的。这意味着在一些其他考虑到这一点的库中,差异是真实存在的。
然而,strtotime()的实现并没有考虑到这一点,因此根据您的示例,这没有任何区别。
我很感兴趣是否可以通过源代码进行跟进,因此在这里进行了说明:
strtotime()的实现如下:
+2天
或+48小时
,这被认为是相对文本。do_range_limit(0, 24, 24, &time->h, &time->d)
,如果小时超过了硬编码限制24,则增加天数并减少小时,并对于天数执行do_range_limit_days(),如果超过了限制,则增加月份并减少天数,考虑闰年(但不考虑时区!)+48小时
还是+2天
进行的。因此没有区别。
echo date('Y-m-d H:i:s', strtotime("+48 hours"));
并检查差异。 - RAUSHAN KUMARstrtotime("+2 days")
将会在原日期基础上添加2天。strtotime("+48 hours")
将会在原时间基础上添加48小时。 - Siddharth Ramani