2012-09-13 65 views
1

我想計算髮布評​​論後的時間。我發現function這個,它運作良好PHP:從用戶端獲取時區偏移並計算「時間前」

但我只注意到顯示給用戶的時間是錯誤的,因爲他/她的時區。我做了一些研究和解決方案似乎是通過用戶的時區偏移到使用稱爲getTimezoneOffset的JavaScript函數的PHP頁面。

問題是我無法設法使用這個Offset來創建一個時區並在上面鏈接的函數上使用它。隨着another code的幫助是什麼,我可以迄今收集:

function humanTiming ($time,$offset) 
{ 

    $isDST = 1; // Daylight Saving 1 - on, 0 - off 
    $timezoneName = timezone_name_from_abbr('', intval($offset, 10) * 36, $isDST); 

    $date = new DateTime($time, new DateTimeZone($timezoneName)); 
    $time = strtotime($date); 

    $time = time() - $time; // to get the time since that moment 

    $tokens = array (
     31536000 => 'year', 
     2592000 => 'month', 
     604800 => 'week', 
     86400 => 'day', 
     3600 => 'hour', 
     60 => 'minute', 
     1 => 'second' 
    ); 

    foreach ($tokens as $unit => $text) { 
     if ($time < $unit) continue; 
     $numberOfUnits = floor($time/$unit); 
     return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':''); 
    } 

} 

而且我們這樣調用該函數:

echo humanTiming ($row['date'],"-240"); 

注:-240是我從運行javascript函數中獲得的價值,所以,這可能是我的時區偏移量。

第一個問題:它似乎值-240是無效的,並且像-0500類似的工作。

第二期:即使我嘗試用有效的偏移值,函數返回42 years

不知道這款42年內如何計算出來的,但它完全錯誤的。

回答

3

幾個問題: Javascript函數getTimezoneOffset()以分鐘爲單位返回時區偏移量,但timezone_name_from_abbr()需要以秒爲單位的偏移量。所以在你的-240的例子中,實際上是-4小時或-14396秒。您可以通過改變數學一點點解決您的代碼:

$timezoneName = timezone_name_from_abbr('', intval($offset) * 60, $isDST); 

既然你已經使用DateTime對象開始,你不能再使用strtotime得到Unix時間戳。相反,你需要format()

$date = new DateTime($time, new DateTimeZone($timezoneName)); 
$time = $date->format('U'); 

這應該得到的結果你是經過。你都拿到42年,因爲時間被設置爲0(strtotime($date)結果爲假),這是Unix紀元 - 1970年

+0

我根據您的文章改變了代碼,現在該函數不返回任何東西。 – xperator

+0

我覺得前一時間功能本身有問題,偏移和時間戳問題是固定的。非常感謝。從幾個小時前或者幾分鐘前,它似乎不計算任何事情。不知道爲什麼。數學問題:P – xperator

+0

ok經過大量測試和試驗後,問題出現了偏移。它必須是一個正數。所以乘以'-1'。再次感謝 :) – xperator

0

您可以抵消一切都像這樣:

$today=new DateTime("-$offset minutes"); 
$tomorrow=new DateTime("+1 day-$offset minutes");