2009-09-18 10 views
5

PHPでタイムゾーンを調整する方法についてはたくさんの情報がありますが、すべてのノイズのために私が何をしたいのかについての答えは見つかりませんでした。PHPのタイムゾーンをDateTime/DateTimeZoneで調整する

タイムゾーンを1つ指定すると、別のタイムゾーンの時刻に変換する必要があります。

Thisは本質的に私がやりたいことですが、PEAR Dateではなく組み込みのPHPライブラリのみを使用して行う必要があります。

これは私が何をしてきたが、それは常に私のGMTへの相対オフセットを与えているようだ:

LA時間:2009-09

$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); 

これが出力されています00::-18T05 00-07:00
オフセット:-36000

を、私は3時間(10800秒)を期待していました。 「-7:00」のことはGMTとの関係をすべて維持していると言いますが、それはなぜ私に「絶対」なオフセットを与えているのかを説明するかもしれません。

このGMT hoohahのない2つのタイムゾーン間のオフセットを取得するにはどうすればよいですか?

ありがとうございました。

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クラスを使用する2つの関数があります。最初のものは、2つのタイムゾーン間の秒単位の差を返します。 2番目のタイムゾーンは、1つのタイムゾーンから別のタイムゾーンへの時間の「変換」を返します。

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); 
} 

デモ:GZippがコメントしたよう

$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

+0

DSTを考慮していないようです。私は上記の機能を使ってCSTをGMTに変え、私のすべての時間は1時間外に出ます。 –

0

2回目から初めてマイナスになります。

あなたは秒単位で時間差を得ることができます。

1

、彼のコードは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バージョンで動作します。しかし、もし私が分と秒差をつけたいのであれば、私のパラメタは何か。時間の配列を意味するdiffs。 – user3305818

+0

'$ diff'(' $ time_str')パラメータは単に 'strtotime'が理解する文字列であり、適切なunixタイムスタンプを返します。それでは、「-1分」または「-1秒」または任意の間隔を渡してください。この質問/回答の目的は、時間差を計算したり、['strtotime'(http://php.net/strtotime)の使い方を説明することではなく、1つのタイムゾーンで時刻を現地時間に変換するためです別のタイムゾーン。 –

+0

その作品。しかし、今私は、1日、3時間、10分、20秒前のようなすべてのパラメータを供給したい場合。教えてください。 – user3305818

関連する問題