簡體   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