3
$placename=timezone_name_from_abbr("", $timezone * 3600, false);
                        $date = date_create($list['stamp'], timezone_open($placename));
                        $datetimezone=new DateTimeZone('Europe/London');
                        $dateTime = new DateTime($list['stamp'],$datetimezone); 
                        $dateTime->setTimeZone(new DateTimeZone($placename)); 

編集

答えとして提案された次のコードを試してみたところ、本来あるべき時間から2時間遅れた時間が生成されました。データベースを確認したところ、DB の時刻が GMT と一致しました。問題は、変換を使用してGMTから変換することです

$timezone=-4

以下のユーザーの回答からのコードは、2時間ずれている時間を生成します。GMT から America/New_York に変換しますが、2 時間遅くなります。placename 変数を調べて、America/New_York であることを確認しました。何が原因でしょうか?

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$dateTime = new DateTime($list['stamp']); 
$dateTime->setTimeZone(new DateTimeZone($placename)); 
echo $dateTime->format('F d g:i a'); 

元の質問

America/New_York 時間に変換する代わりに、データベースに保存した UTC 時間を生成しました。これはなぜですか。時間を変換しなかったのはなぜですか? としてdbに保存されます2012-05-13 07:30:47

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$date = date_create($list['stamp'], timezone_open($placename));
echo date_format($date, 'F d g:i a');
4

1 に答える 1

6
$dateTime = new DateTime($date,new DateTimeZone('Europe/London')); 
$dateTime->setTimeZone(new DateTimeZone('America/New_York')); 
echo $dateTime->format('F d g:i a'); 

オブジェクトの作成時に 2 番目のパラメーターを追加して、DateTime渡しているものが GMT 時間であることを確実に認識できるようにすることに注意してください。他の方法では、サーバーの現地時間を想定し、異なる結果になる可能性があります。

引用符なしの最初のバージョンに。

ところで、(コードで) 引用符なしで文字列を割り当てています。PHP は呼び出された定数を探してAmerica定数名で除算しようとするため、エラーが発生する場合と発生しない場合がありますNew_Yorkが、私はそれを想定しています。あなたが求めているものではありません。

すべての警告/通知/エラーが表示されている場合は、次の行に何かが表示されます。

Notice: Use of undefined constant America - assumed 'America' in line 3;

考えてみると、実際の警告が返されることになります (前の 2 つの警告は通知でした)。PHP は、実際には何も壊すことなく、あらゆる種類のクレイジーなことを実行できるという意味で危険です。誤解しないでください。私は PHP が大好きです。最初は注意が必要です。

私があなたに与えたコードは動作します:)

作成時に (コンストラクターの 2 番目のパラメーターとして) タイムゾーンを指定しない場合、タイムゾーンが現在のタイムゾーン (サーバーのタイムゾーン) であると想定されます。GMT タイムゾーンまたは任意のものを渡すことで、これをオーバーライドできます。データベースに保存しました。

ただし、ドキュメントには次のような警告があります: 注:

$time パラメータが UNIX タイムスタンプ (例: @946684800) であるか、タイムゾーンを指定している場合 (例: 2010-01-28T15:00:00+02:00)、$timezone パラメータと現在のタイムゾーンは無視されます。

ドキュメント

于 2012-05-13T07:58:29.040 に答える