首页
学习
活动
专区
圈层
工具
发布

>diff
EN

Stack Overflow用户
提问于 2015-07-29 20:48:20
回答 2查看 397关注 0票数 2

今天我正在研究一个php代码,发现这真的很奇怪。

代码语言:javascript
复制
<?php
  $now = new DateTime("2015-07-29 03:38:55");
  $previous = new DateTime("2013-07-29 05:06:40");
  $diff = $now->diff($previous);
  $diff2 = $previous->diff($now);

  printf("%d years, %d month, %d days, %d hours, %d minutes %d seconds.<br/>", $diff->y, $diff->m, $diff->d, $diff->h, $diff->i, $diff->s);
  printf('%d years, %d month, %d days, %d hours, %d minutes %d seconds', $diff->y, $diff->m, $diff2->d, $diff2->h, $diff2->i, $diff2->s);

输出是

1年11个月30天22小时32分15秒

1年11个月29天22小时32分15秒

我有两个问题

  1. 我读过它说的$previous->diff($now);显示$now - $previous的文档。然而,如果是相反的情况,它不是消极的吗?
  2. 为什么一天是30天,另一天是29天?
EN

回答 2

Stack Overflow用户

发布于 2015-07-29 21:07:27

我有一个推测,这可能是由于倒置。我不太清楚为什么要多加一天.但我做的一个快速改变是:

代码语言:javascript
复制
$now = new DateTime("2015-07-29 03:38:55");
$previous = new DateTime("2013-07-29 05:06:40");

$diff = $now->diff($previous);
$diff2 = $previous->diff($now);

printf("%d years, %d month, %d days, %d hours, %d minutes %d seconds\r\n", $diff->y, $diff->m, ($diff->d - $diff->invert), $diff->h, $diff->i, $diff->s);
printf('%d years, %d month, %d days, %d hours, %d minutes %d seconds', $diff->y, $diff->m, ($diff2->d - $diff2->invert), $diff2->h, $diff2->i, $diff2->s);

产出如下:

代码语言:javascript
复制
1 years, 11 month, 29 days, 22 hours, 32 minutes 15 seconds
1 years, 11 month, 29 days, 22 hours, 32 minutes 15 seconds

或者,或者,以上是完全错误的,只是一个巧合.另一种解释可能是差异日是$diff的浮动值,因此它被舍入.产生29天。也可能是闰年的问题。

编辑

以上也是错误的..。如果将输出更改为浮动,它将显示整数。这就增加了混乱。我会留下这个答案,可能会帮助别人想出解决办法。

代码语言:javascript
复制
$now = new DateTime("2015-07-29 03:38:55", new DateTimeZone('GMT'));
$previous = new DateTime("2013-07-29 05:06:40", new DateTimeZone('GMT'));

$diff = $now->diff($previous);
$diff2 = $previous->diff($now);

printf("%f years, %f month, %f days, %f hours, %f minutes %f seconds %f total days\r\n", $diff->y, $diff->m, $diff->d, $diff->h, $diff->i, $diff->s, $diff->days);
printf('%f years, %f month, %f days, %f hours, %f minutes %f seconds %f total days', $diff->y, $diff->m, $diff2->d, $diff2->h, $diff2->i, $diff2->s, $diff2->days);

我甚至设定时区希望能有所帮助。仍然得出了完整的数字:

代码语言:javascript
复制
1.000000 years, 11.000000 month, 30.000000 days, 22.000000 hours, 32.000000 minutes 15.000000 seconds 729.000000 total days
1.000000 years, 11.000000 month, 29.000000 days, 22.000000 hours, 32.000000 minutes 15.000000 seconds 729.000000 total days
票数 1
EN

Stack Overflow用户

发布于 2017-01-06 16:19:22

  1. 差异的符号出现在invert属性中:$diff->invert=1和$diff2->invert=0
  2. 您可以在php源这里中看到每日更正1次时:
    1. 第一个日期是DST,第二个日期不是
    2. 第二个日期的时间戳在第一个日期的时间戳之后开始,没有DST校正。
    3. 第二个日期的时间戳在第一个日期的时间戳之前开始,并进行DST校正。

这就是导致一个显示30天,另一个显示29天的原因。在@半疯狂的例子中,这两个日期都在DST中,所以没有更正。如果previous OP的日期是2013-07-29 03:06:40,那么它们就没有什么区别了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31710798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档