PostgresでDoctrine2を使用します。 1つのテーブルには、birthdate:date
とcreated_at:datetimetz
の2つの異なる日付タイプがあります。両方ともDateTimeオブジェクトになりますが、timezone_type
が異なります。リストは次のとおりです。
created_at
datetimetz:
DateTime Object
(
[date] => 2013-04-18 11:54:34
[timezone_type] => 1
[timezone] => +02:00
)
birthdate
日付:
DateTime Object
(
[date] => 1970-01-01 00:00:00
[timezone_type] => 3
[timezone] => Europe/Berlin
)
同じ方法でオブジェクトをフォーマットする必要があります。両方にtimezone_type=3
が必要です。
どうすればそれを達成できますか?
タイムゾーンは、DateTimeオブジェクトの3つの異なるタイプのいずれかです。
new DateTime("17 July 2013 -0300");
などのUTCオフセットnew DateTime("17 July 2013 GMT");
などのタイムゾーンの略語new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));
などのタイムゾーン識別子タイプ3タイムゾーンが付加されたDateTimeオブジェクトのみがDSTを正しく許可します。
タイプ3を常に保持するために、タイムゾーンを this list から受け入れられる識別子としてデータベースに保存し、インスタンス化時にDateTimeオブジェクトに適用する必要があります。
私はこれが古代の投稿であることを知っていますが、Doctrineが言及されたので、この問題に関して最近経験したことを共有する必要があると感じています。
@vascowhiteは正しいのですが、Doctrine(少なくとも私の構成では)に関して、HTTP経由でサーバーに送信される(たとえば保存する)日付はタイムゾーンタイプ2に変換されます。Doctrine日付は正しく保存されますが、タイムゾーンタイプはnot変換されません。
「新しい値を保存して返す」タイプの操作を実行している場合、Doctrineはキャッシュされた値(timezone_type 2を使用)を使用することに注意してください。これは、通常ページのリロード中に取得されるtimezone_type 3を期待している場合に重要になります。 timezone_type 3を予期するカスタム日付コンバーターJSクラスがあり、変換できませんでした。確かに、日付コンバーターはこれを考慮する必要がありますが、タイムゾーンタイプがDoctrineで最後にロードされた値になることにも注意する必要があります。保存後にDoctrineのキャッシュをクリアすると、データがtimezone_type 3で強制的にリロードされます。