2017-09-19 57 views
1

背景通過時區

我做一些更新,以PHP應用程序,這是非常古老計算PHP當前時間。在應用程序中出現錯誤,因爲使用了折舊函數mktime()。我使用time()代替整個應用程序更新了此功能。一旦我這樣做,我注意到,當顯示一個用戶的本地時間是由他們的郵政編碼計算出來的時候,它比當地實際時間晚了一個小時。

我已經將時間計算追蹤到下面的函數。時間被傳遞到的值,$client["localtime"]

示例代碼

if (isset($time) && $time) { 
    $utc_str = gmdate("M d Y H:i:s", time()); 
    $utc = strtotime($utc_str); 
    if (isset($tznames[ $time["timezone"] ])) { 
     $client["timezone"] = $tznames[ $time["timezone"] ]; 
    } else { 
     $client["timezone"] = "Unknown"; 
    } 
    if ($time["daylightsavings"] == "Y" && date("I")) { 
     $time["timezone"]--; 
    } 
    $client["localtime"] = date("g:ia", $utc - ($time["timezone"] * 3600)); 
} else { 
    $client["localtime"] = "Unknown"; 
    $client["timezone"] = "Unknown"; 
} 

問題

爲什麼這個顯示1小時,什麼必須爲客戶的時區的本地時間落後我需要修復它?

+0

「時區」是什麼意思?看起來像「時區」實際上是一個數字* UTC抵消*? – deceze

回答

1
if (isset($time) && $time) { 
    $utc_str = gmdate("M d Y H:i:s", time()); 
    $utc = strtotime($utc_str); 
    if (isset($tznames[$time["timezone"]])) { $client["timezone"] = $tznames[$time["timezone"]]; } 
    else { $client["timezone"] = "Unknown"; } 
    if ($time["daylightsavings"] == "Y" && date("I")) { $time["timezone"]--; } 



    // print_r(($time["timezone"] * 3600).",".$client["timezone"].",".$time["timezone"].",".$utc_str.",".$utc); 
     $client["localtime"] = date("g:ia", $utc - ($time["timezone"] * 3600 - 3600)); 
} else { $client["localtime"] = "Unknown"; 
$client["timezone"] = "Unknown";} 

檢查上面的代碼我從減去3600,使其顯示1小時晚請檢查如果它能工作

0

您可以使用此功能

function convertTimeByTimezone($datetime,$timezone='Asia/Kolkata') { 
     $given = new DateTime($datetime, new DateTimeZone("UTC")); 
     $given->setTimezone(new DateTimeZone($timezone)); 
     $output = $given->format("Y-m-d H:i:s"); 
     return $output; 
} 
+0

這是必要的,我明白爲什麼這個函數dos不工作時,從mktime(0到時間()然後修復它。謝謝雖然。我知道我可以寫一個新的功能,但重點是瞭解更改,這樣我可以對應用程序中的代碼進行最小限度的更改,以使其在全球範圍內正常工作,並瞭解折舊功能更新時會中斷的事件。 – wuno

0

您可以使用此代碼:

$date = new DateTime("now", new DateTimeZone('Australia/Adelaide')); 
echo 'Australia/Adelaide: '.$date->format('Y-m-d H:i:s'); 

$date1 = new DateTime("now", new DateTimeZone('America/Chicago')); 
echo 'America/Chicago: '. $date1->format('Y-m-d H:i:s');