2009-10-13 4 views
5

これは午前中にこれを行う方法について読んできました。一般的な考え方は次のとおりです。タイムスタンプをUTCで保存し、そこからオフセットを計算します。UTCを使用せずにタイムゾーンを表示

しかし、ほとんどの人のように、私は既存のコードベースを維持しており、私たちが日付を保存する方法を変更することはできません。少なくとも、割り当てられた時間枠ではありません。

私の質問は、このようなことができますか?

// this is my time zone 
$timestamp = strtotime($timestampFromDatabase); 
date_default_timezone_set('America/New York'); 
$tz = date_default_timezone_get(); 

// this is theoretically their timezone, which will eventually 
// be taken from a session variable 
date_default_timezone_set('Europe/Paris'); 
$offset = time() - $timestamp; 
$timestamp -= $offset; 

// now that I have the offset, display dates like this 
date('r', $timestamp); 

何人かの人が日付の算術演算に反対することを勧めてきましたが、私はここで間違っていますか?より良い方法がありますか?私が注意しなければならない落とし穴がありますか?私は特に、このメソッドがどのような種類のバグを生成する可能性があるのか​​、もしあれば誰が影響を与えるのかについて興味を持っています。

私の上司は、このバグがユーザーベースの1%にしか影響しないかどうか気にしない種類の人です。

編集:これをもっと明確にすることはできますか?私はこれについてあまりにも多くの受取人を持っていないようです。誰でも?あいまいな提案やリンクさえも非常に有用です。

答えて

5

簡単な答えは、タイムゾーンが扱いにくく、難しい質問に取り組んでいないということです。

長く、答えはこれです:

まず、あなたは彼らの現在のタイムゾーンでは、あなたの日付の表現を作成する必要があります。以下は等価です。

date_default_timezone_set('America/New York'); 

$date = new DateTime(null); 

OR

$date = new DateTime(null, new DateTimeZone('America/New York')); 

これはあなたにアメリカ/ニューヨークに設定ゾーンと日付を与えます。私たちは簡単にヨーロッパ/パリの次の行で、この場合には、ユーザーのタイムゾーンに変換することができます:

$date->setTimezone(new DateTimeZone('Europe/London')); 

あなたが任意の時点で表される日付/時間を取得するには、次の行を使用することができます。 PHPの組み込み関数として、私は強くは、算術上でこれをお勧め

echo $date->format('d/m/Y H:i:s'); 

は、あなたが権利を取得しません、複雑な物事の時間とたくさんの夏時間の知識を持っています。フルで


私のテストスクリプト:

date_default_timezone_set('America/Belize'); 

$date = new DateTime(null); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 

$date->setTimezone(new DateTimeZone('Europe/London')); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 
+0

また、将来の使用のための1つのオフジョブでUTCにデータベースを更新するには、このアプローチを使用することができます。 –

+0

これは素晴らしいです。しかし、私はこのオブジェクトを持っていないPHP 5.14を実行していると仮定します。別の方法がありますか? –

+0

Zend FrameworkはZend_DateにPHPベースのソリューションを持っていますが、フレームワークの一般的な要件としてPHP 5.2.4を求めています。それは働くかもしれない*。 PHPをアップグレードまたは再コンパイルできますか? –

関連する問題