繁体   English   中英

PHP的日期时间->差异

[英]PHP DateTime->diff

我今天正在检查一个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->diff($now); 显示$now $previous 但是,如果相反,这是否定的呢?

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

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

$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 days是$diff的浮点值,因此将其四舍五入...产生29天。 可能还有leap年问题。

编辑

上面的方法也是错误的...如果将输出更改为float,它将显示整数。 这加剧了混乱。 我将保留此答案,以帮助其他人找出解决方案。

$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
  1. 差异的符号在invert属性中: $diff->invert = 1和$diff2->invert = 0
  2. 您可以在此处的php源代码中看到以下情况下每天的修正1:
    1. 日期的第一天是夏令时,第二天不是
    2. 第二个日期的时间戳记在第一个日期的时间戳记之后 经过DST校正而开始
    3. 第二个日期的时间戳开始 具有 DST校正的第一个日期的时间戳之前

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

暂无
暂无

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

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