2009-09-18 34 views
5

有很多關於在PHP中進行時區調整的信息,但是由於所有的噪音,我還沒有找到具體要做的事情的答案。使用DateTime/DateTimeZone在PHP中調整時區

給定一個時區的時間,我想將其轉換爲另一個時區的時間。

This本質上是我想要做的,但我需要能夠使用只有內置的PHP庫,而不是PEAR日期。

這是我一直在做什麼,但似乎偏移相對於總是給我GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

這是輸出:

LA時間:2009-09 -18T05:00:00-07:00
偏移:-36000

我期待3小時(10800秒)。但'-7:00'的東西告訴我它保留了與GMT相關的所有內容,這也許可以解釋爲什麼它給了我「絕對」的偏移量。

我該如何獲得兩個時區之間的偏移量,但沒有所有GMT hoohah?

謝謝。

UPDATE:

我發生,我認爲我可以做到這一點,並得到我想要的東西:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

但感覺彆扭給我。任何人都知道一個更清潔的方法來做到這一點

回答

8

這裏有幾個使用DateTime類的函數。第一個將返回兩個時區之間的差值。第二個返回從一個時區到另一個時區的「翻譯」。

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

演示:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

順便說一句:),這些是PHP> = 5.3.0。 – GZipp 2009-09-18 22:58:04

+0

他們似乎沒有考慮到DST。即時通訊使用上述功能將CST轉換爲GMT,我所有的時間都在1小時以內。 – 2013-06-07 10:11:55

0

簡單地從第二次減去第一次。

你可以以秒爲單位獲得時差。

1

由於GZipp評論說,他的代碼實際上只是針對PHP> = 5.3.0。這很好,但是 - 這是一個可以在PHP> = 5.2.0中使用的版本。 (順便說一下,它也可以在5.3+以及少用2個函數調用)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

非常感謝您使用php 5.2版本。但是,如果我想分鐘和秒差異,那麼我的參數應該是什麼。時間差異排列的手段。 – user3305818 2014-07-14 13:40:04

+0

'$ diff'('$ time_str')參數只是一個'strtotime'可以理解的字符串,它將返回一個合適的unix時間戳。所以只需通過''-1分鐘或'秒-1'或任何你想要的時間間隔。這個問題/答案的目的不是要計算時間差異或解釋['strtotime'](http://php.net/strtotime)的用法,它用於將一個時區的時間轉換爲當地時間另一個時區。 – 2014-07-14 13:49:26

+0

它的作品。但是現在如果我想提供像1天,3小時,10分鐘和20秒之前的所有參數。請告訴我。 – user3305818 2014-07-14 13:54:26