2016-12-29 97 views
0

我很奇怪,爲什麼我一直在用PHP所有的時間去完全無效的計算之間的日期。差異服務器

我有這樣的代碼:

echo floor((strtotime("2017-03-27") - strtotime("2017-03-24"))/86400); 

其在服務器返回的一個:3(比如3天)

,並在另一臺服務器的回報:2! (2.9583333333333天?)爲什麼會有差異?

+0

爲什麼無論什麼是聖潔的世界各國都在使用'樓()在'日期計算? – junkfoodjunkie

+0

@junkfoodjunkie是禁止的嗎?很高興知道,也許這是導致我的問題? – corey

+2

致命的假設,每天有86400個假設 –

回答

2

或者,只是使用更好的方法:

編輯我更新使用相同的日期作爲OP的代碼。它會返回,因爲它應該這樣做,我相當確信它會在您將其用於測試的任何服務器上執行此操作。

<?php 

$date1 = date_create('2017-03-27'); 
$date2 = date_create('2017-03-24'); 

$interval = date_diff($date1,$date2); 

echo $interval->format('%a'); 

?> 

編號:http://php.net/manual/en/function.date-diff.php

0

你的服務器也許坐在兩個不同的時區。將日期轉換爲小時,您將得到一小時的差異。

3 days  * 24 hours/1 day = 72 hours 
2.958333 days * 24 hours/1 day = 71 hours 
+0

我想這也可能是自3月份以來的日期變化。 – Sammitch

+0

@Sammitch DST於3月12日星期日在美國大多數州**假設** Corey在美國,所以如果兩臺服務器在同一個時區,與DST無關。超過一個小時,一臺服務器可能比另一臺服務器長。 – user7351608

+0

DST的變化在3月26日幾乎是世界其他地方。 – Sammitch

0

由於某些人的難以接受,這是由於特定的TZ-DST的變化,有一些證據:

function poc($tz_str) { 
     $tz = new DateTimeZone($tz_str); 
     $start = (new DateTime('2017-03-24', $tz))->format('U'); 
     $end = (new DateTime('2017-03-27', $tz))->format('U'); 

     return [$tz_str, $end - $start, ($end - $start)/86400]; 
} 

var_dump(
     poc('UTC'), 
     poc('Europe/London'), 
     poc('America/New_York') 
); 

輸出:

array(3) { 
    [0]=> string(3) "UTC" 
    [1]=> int(259200) 
    [2]=> int(3) 
} 
array(3) { 
    [0]=> string(13) "Europe/London" 
    [1]=> int(255600) 
    [2]=> float(2.9583333333333) 
} 
array(3) { 
    [0]=> string(16) "America/New_York" 
    [1]=> int(259200) 
    [2]=> int(3) 
} 
  • UTC沒有DST,不受影響。
  • 大多數東半球的有3月26日他們的DST更改,影響
  • 3月12日,西半球大部分地區的DST變化未受影響。

也就是說,不要在Unix時間戳上進行手動日期數學計算。