一方で@drrcknlsnはdatatimeに時間文字列を変換する複数の方法があります主張する正しいですが、それは、これらの異なる方法は、同じようにタイムゾーンを扱うしていないことを認識することが重要です。
オプション1 : DateTime('@' . $timestamp)
次のコードを検討してください。
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
このstrtotime
ビットはタイムゾーン情報を削除し、date_create
関数はGMT(Europe/Brussels
)を想定します。
そのため、どのサーバーで実行しても、出力は次のようになります。
2011-12-12T13:17:52+00:00
オプション2: date_create()->setTimestamp($timestamp)
次のコードを検討してください。
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
これで同じ出力が得られると期待するかもしれません。ただし、ベルギーのサーバーからこのコードを実行すると、次の出力が得られます。
2011-12-12T14:17:52+01:00
date_create
関数とは異なり、このsetTimestamp
メソッドは'Europe/Brussels'
GMTではなくサーバーのタイムゾーン(私の場合)を想定しています。
タイムゾーンを明示的に設定する
出力が入力のタイムゾーンと一致することを確認する場合は、明示的に設定することをお勧めします。
次のコードを検討してください。
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
ここで、次のコードも検討してください。
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
出力のタイムゾーンを入力のタイムゾーンと一致するように明示的に設定しているため、どちらも同じ(正しい)出力を作成します。
2011-12-12T21:17:52+08:00