2013-02-01 37 views
0

我有來自特定時區(牙買加)的時間戳,我想獲得它的GMT時間戳。有沒有更好的解決方案不止這一個:時區日期時間與PHP中的偏移量,讓它變得容易

$start = DateTime::createFromFormat('U', 1330560000); 
     $start->setTimezone(new DateTimeZone('America/Jamaica')); 
     $start->format('Y-m-d H:i:s');//2012-02-29 19:00:00 NO NO NO 

     $tz = new DateTimeZone('America/Jamaica'); 
     $transition = $tz->getTransitions($start->getTimestamp(),$start->getTimestamp()); 


     $offset = $transition[0]['offset']; 


     $start = DateTime::createFromFormat('U', $params['start'] - 2*$transition[0]['offset']); 
     $start->setTimezone(new DateTimeZone('America/Jamaica')); 
     $start->format('Y-m-d H:i:s'); // "2012-03-01 05:00:00" YESSSS!!! 
+2

時間戳在時區之間是不變的。具體來說,'1330560000'是2012-03-01 00:00:00 UTC。如果這不是您想要的時間,那麼產生此時間戳的代碼就會出錯。 – Jon

+0

@Jon 1330560000是牙買加(或其他沒有DST的時區),我需要UTC時間(2012-03-01 05:00:00) – user1222955

+1

@ user1222955:不,1330560000不是「牙買加時間」。它是一個特定的時刻*,它是UTC的00:00:00和牙買加的2012-02-29 19:00:00(顯而易見,UTC-5)。 PHP在這裏做的是正確的;這是你的期望是錯誤的。如果應該達到的結果是您所期望的結果,那麼產生時間戳的代碼也是錯誤的。 – Jon

回答

0

這是我的課的一部分,正如我在功能的評論中寫道,創造一個良好的格式化的時間戳,這是非常容易使用只傳遞字符串日期,時區和標識符。

希望它可以幫助你

/** 
* Default timestamp format for formatted_time 
* @var string 
*/ 
public static $timestamp_format = 'Y-m-d H:i:s'; 
/** 
* Returns a date/time string with the specified timestamp format 
* @example $time = Date::formatted_time('5 minutes ago'); 
* @link http://www.php.net/manual/datetime.construct 
* @param string $datetime_str  datetime string 
* @param string $timestamp_format timestamp format 
* @param string $timezone   timezone identifier 
* @return string 
*/ 
public static function formatted_time($datetime_str = 'now', $timestamp_format = NULL, $timezone = NULL){ 
      $timestamp_format = ($timestamp_format == NULL) ? Date::$timestamp_format : $timestamp_format; 
      $timezone   = ($timezone === NULL) ? Date::$timezone : $timezone; 
      $tz = new DateTimeZone($timezone ? $timezone : date_default_timezone_get()); 
      $time = new DateTime($datetime_str, $tz); 
      if ($time->getTimeZone()->getName() !== $tz->getName()){ 
       $time->setTimeZone($tz); 
      } 
      return $time->format($timestamp_format); 
     } 
1

Unix時間或POSIX時間,是用於描述時刻的系統,定義爲自午夜以來經過的秒數協調世界時(UTC) ,1月1日1970年

Wikipedia

的UNIX時間戳的想法是,它總是在UTC(在世界各地的xD)。如果它不代表UTC中的時間,則它不再是UNIX時間戳

+0

感謝您的澄清。好的,所以1330560000是牙買加時間,而不是UTC。我希望UTC – user1222955

+0

@ user1222955它是UTC,而不是牙買加。只需設置GMT時區,然後格式化您的日期時間。在腳本中,您將第2行更改爲'$ start-> setTimezone(new DateTimeZone('GMT'));',並刪除該行...第4行之後的任何內容。DateTime :: format()格式化當前時區的時間這是爲它設置的。所以如果你想打印GMT時間 - 用GMT DateTimeZone提供。再次想要牙買加 - 將時區設置回牙買加。時間戳始終是UTC,除非您的時鐘設置錯誤,否則它在整個世界中都是相同的。 – Slava