繁体   English   中英

php中2天到48小时的区别是什么?

[英]What is the difference between 2 days and 48 hours in php

$new_date = date('Y-m-d', strtotime("+2 days"));

要么

$new_date = date('Y-m-d', strtotime("+48 hours"));

它们是相同还是不同

它们是相同还是不同

他们是完全不同的。 客观地说,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://3v4l.org/L4tKo

这个与常见日期/时间相关的虚假列表值得一试〜https ://github.com/kdeldycke/awesome-falsehood#dates-and-time


值得指出的是,使用相同的参考日期并使用strtotime()会产生与上述相同的结果。

演示~ https://3v4l.org/O6MTd

我怀疑这是因为它的相对时间计算不像DateInterval那样微妙。

在语义上它们是不同的,正如菲尔在另一个答案中所证明的那样。 这意味着在其他一些图书馆中,这种差异是真实的。

但是, strtotime()的实现并未考虑到这一点,因此,根据您的示例,它没有任何区别。

我感兴趣的是它是否可以通过源代码进行跟进,所以这里是:

strtotime()的实现做到了这一点:

  1. strtotime()启动 ,调用timelib_strtotime()来创建初始ts构造
  2. timelib_strtotime()调用scan()来解析字符串
  3. 它读取你给它的字符串,它获得的一个标记是你的+2 days+48 hours ,这被认为是相对文本
  4. 对于relativetext,除其他外, 调用timelib_set_relative()
  5. 在timelib_set_relative()中,使用timelib_lookup_relunit()进行查找,它使用timelib_relunit_lookup数组 ,发现您提供的类型为TIMELIB_DAY,值为1,乘数为2的构造,或构造TIMELIB_HOUR,值为1,乘法器24
  6. 保存了先前调用s-> time-> relative构造的信息
  7. 这个构造被传递,直到strtotime用它调用timelib_update_ts (并带有时区信息!)
  8. 在timelib_update_ts中,我们调用do_adjust_relative()来对其进行操作。 我们不使用时区参数来做,我认为这是一个关键的错误
  9. do_adjust_relative()调用timelib_do_normalize()
  10. timelib_do_normalize()表示do_range_limit(0, 24, 24, &time->h, &time->d) ,如果小时数超过硬编码限制(24小时do_range_limit(0, 24, 24, &time->h, &time->d) ,则增加天数和减少小时数,并且几天内do_range_limit_days() ,增加如果我们超过极限,则考虑到跳跃时间(但不是时区!)。
  11. 在返回timelib_update_ts时,我们用时区参数调用do_adjust_timezone ,但此时我们已经进行了所有调整,如果用+48 hours+2 days完成,我们就不知道了。 因此没有区别。

TLDR:strtotime()在进行转换时不考虑时区,因此在该函数中它没有任何区别,即使它真的应该。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM