web-dev-qa-db-ja.com

DateTimeオブジェクトの異なるtimezone_types

PostgresでDoctrine2を使用します。 1つのテーブルには、birthdate:datecreated_at:datetimetzの2つの異なる日付タイプがあります。両方ともDateTimeオブジェクトになりますが、timezone_typeが異なります。リストは次のとおりです。

created_atdatetimetz:

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が必要です。

どうすればそれを達成できますか?

27
lilly

タイムゾーンは、DateTimeオブジェクトの3つの異なるタイプのいずれかです。

  • タイプ1; new DateTime("17 July 2013 -0300");などのUTCオフセット
  • タイプ2; new DateTime("17 July 2013 GMT");などのタイムゾーンの略語
  • タイプ3:new DateTime( "17 July 2013", new DateTimeZone("Europe/London"));などのタイムゾーン識別子

タイプ3タイムゾーンが付加されたDateTimeオブジェクトのみがDSTを正しく許可します。

タイプ3を常に保持するために、タイムゾーンを this list から受け入れられる識別子としてデータベースに保存し、インスタンス化時にDateTimeオブジェクトに適用する必要があります。

65
vascowhite

私はこれが古代の投稿であることを知っていますが、Doctrineが言及されたので、この問題に関して最近経験したことを共有する必要があると感じています。

@vascowhiteは正しいのですが、Doctrine(少なくとも私の構成では)に関して、HTTP経由でサーバーに送信される(たとえば保存する)日付はタイムゾーンタイプ2に変換されます。Doctrine日付は正しく保存されますが、タイムゾーンタイプはnot変換されません。

「新しい値を保存して返す」タイプの操作を実行している場合、Doctrineはキャッシュされた値(timezone_type 2を使用)を使用することに注意してください。これは、通常ページのリロード中に取得されるtimezone_type 3を期待している場合に重要になります。 timezone_type 3を予期するカスタム日付コンバーターJSクラスがあり、変換できませんでした。確かに、日付コンバーターはこれを考慮する必要がありますが、タイムゾーンタイプがDoctrineで最後にロードされた値になることにも注意する必要があります。保存後にDoctrineのキャッシュをクリアすると、データがtimezone_type 3で強制的にリロードされます。

1
alwayslearning