【问题标题】:PHP DateTime->diffPHP日期时间->差异
【发布时间】:2015-07-29 20:48:20
【问题描述】:

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

<?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-&gt;diff($now); 显示$now - $previous 的文档。但是,如果反过来,那不是负数吗?

  2. 为什么一个是 30 天,另一个是 29 天?

【问题讨论】:

  • 如果你只关心绝对差异添加使用 $diff = $now->diff($previous, true);
  • 1.检查$diffinvert,它显示结果是否为负。 2. 请参阅此question 中的answer,了解为什么日子不同。

标签: php date datetime diff


【解决方案1】:

我推测这可能是由于反转造成的。我不完全确定为什么要增加一天...但我做的一个快速更改是:

$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);

输出是:

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天。也可能出现闰年问题。

编辑

上面的也是错误的...如果将输出更改为浮点数,它将显示整数。这增加了混乱。我会留下这个答案,以帮助其他人找出解决方案。

$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);

我什至设置了时区,希望能有所帮助。仍然产生整数:

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

【讨论】:

  • 如果$now = 2015-07-29 04:38:53$previous = 2013-07-29 04:38:54 第一个输出是1 years, 11 month, 30 days, 23 hours, 59 minutes 59 seconds,第二个输出是1 years, 11 month, 29 days, 23 hours, 59 minutes 59 seconds。但是,如果 $now= $previous 除了年份。两者的输出是一样的。
  • 我在想可能还有 DST 错误...但我无法确认。
【解决方案2】:
  1. 不同之处在于invert 属性:$diff-&gt;invert=1 和$diff2-&gt;invert=0
  2. 可以在php源码中看到here一天修正1的时候:
    1. 第一个日期是夏令时,第二个不是
    2. 第二个日期的时间戳第一个日期的时间戳之后开始没有夏令时更正
    3. 第二个日期的时间戳开始于第一个日期的时间戳DST 更正

这是导致一个显示 30 天而另一个显示 29 的原因。在@Half Crazed 的示例中,两个日期都在 DST 中,因此没有更正。如果OPprevious 日期是2013-07-29 03:06:40,则它们不会有区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多