2010-11-28 49 views
4

我被告知下面這種計算用戶當地時間的方法有時不起作用。在PHP中執行此操作的最佳方法是什麼?你是做什麼?如何處理PHP中的時區差分計算?

public function getTimeOffset ($time) { 
    $this->_cacheTimeOffset(); 
    if ($this->timeOffsetExecuted) { 
     $d = date("O"); 
     $neg = 1; 

     if (substr($d, 0, 1) == "-") { 
      $neg = -1; 
      $d = substr($d, 1); 
     } 

     $h = substr($d, 0, 2)*3600; 
     $m = substr($d, 2)*60; 

     return $time + ($neg * ($h + $m) * -1) + (($this->timeOffset + $this->getDstInUse()) * 3600); 
    } 
    return $time; 
} 

回答

2

使用datetime擴展名,如DateTime::getOffset
DateTimeZone::getOffset

一些國家可能有執行幾個時區更新,
這種方法DateTimeZone::getTransitions揭示過渡的歷史

+0

我目前允許用戶在他們的個人資料中指定他們的時區。你是否在說我應該能夠通過PHP動態調用它,而不必問他們的時區? – Webnet 2010-11-29 14:34:45

+1

@Webnet - 您仍然需要用戶將其當前時區放入其配置文件中。可能你可以提供一個時區列表,讓用戶選擇。 `DateTimeZone :: listIdentifiers`能夠提供完整的時區支持列表,詳細信息 - http://www.php.net/manual/en/datetimezone.listidentifiers.php – ajreal 2010-11-29 18:28:42

-1

一個快速的解決方案:

<?php echo date('g:i a', strtotime("now + 10 hours 30 minutes")); ?> 
0

剛剛回答了一個非常類似的問題over here。我建議你檢查一下;我解釋了做時區偏移計算的兩種首選方法(使用簡單的數學方法,然後使用datetimezonedatetime類)。

第一種方法是最簡單的 (和最符合邏輯的)的方式,那就是 店的偏移(如果你已經 得到它,那是),然後乘以 3600(1小時秒),然後將 的值添加到當前的unix時間戳中,以使其最終時間爲 運行。

另一種方法是使用 DateTimeDateTimeZone類。 這兩個類如何工作,如圖所示 here,是你創建了兩個對象,一個是你的 時區,一個是他們的;創建對象與第一 參數是"now"和 第二個是上述 (分別)的參考 DateTimeZone對象;然後調用 getOffset方法上時區 對象傳遞他們時區對象 作爲第一個參數,最終 讓你以秒爲單位 可以被添加到當前Unix 時間戳來獲取時間偏移他們的 工作需要運行。

1
date('Z'); 

返回UTC在幾秒鐘內偏移。