生成された管理アプリを含む Symfony プロジェクトがあり、日時フィールドを東部時間として表示する必要があります。現在、Symfony はすべての日時値を UTC として処理するように設定されています。これは設計によるものです。このプロジェクトにフックする他のさまざまなものが UTC 日時を処理するためです。ユーザーが東部タイムゾーンにいるかのように、管理者が日時入力を表示して受け入れる必要があるだけです。
これを達成するために私たちが行ったことの短いリストを次に示します。
アプリの setting.yml の default_timezone 設定を「America/New York」に変更します。まず、admin での datetime フィールドの表示方法が実際には変更されていないようです。date_default_timezone_set() のみを設定しているようです。次に、一部のヘルパー関数は UTC を想定して作成されているため、実際には PHP で UTC の時刻を処理する必要があります。最後に、日時を UTC として MySQL データベースに格納する必要があります。これらはすべて (タイムスタンプではなく) DATETIME 列として定義されているため、私が理解しているように、タイムゾーン ナイーブです。(ただし、ここで間違っている可能性があります。)
関連する管理フォーム オブジェクトを変更して、オブジェクトの保存/編集時に日時を ET から UTC に変換し、編集フォームに同じ値を事前入力するときに逆の変換を行うカスタム ウィジェットを作成します。これは実際にはうまくいきましたが、ここには重大な問題があります。たとえば、カスタム ウィジェットを作成する必要があります。しかし、これはそれほど大したことではありませんでした。また、日時フィールドを含むすべてのクラスの管理フォームを変更する必要があります。これは、お尻のもう少しの痛みです。また、影響を受けるクラスにヘルパー関数を追加する必要があります。管理フォームには正しい値が表示されますが、これらの日時列のいずれかが管理 LIST に表示される場合、ET 時間ではなく UTC 時間として表示されるためです。次に、タイムスタンプ可能な動作も拡張する必要があります。これは、THOSE も ET/store に UTC で表示する必要があるためです。
影響を受けるクラスの save() および load() 関数をオーバーライドします。管理フォームから取得した ET 日時文字列を UTC に変換し、組み込みのセッター関数を使用してオブジェクトを変更してから、親の save() を呼び出してみました。それはうまくいきました。ただし、逆に load() 関数に同じことをしようとすると、惨めに失敗しました。親の load() 関数を呼び出すことは問題ありませんでしたが、組み込みセッターを使用して時間を UTC から ET に戻すことはできませんでした。私たちが知る限り、load() 関数は実際にはまったく実行されていないことが判明しました。既存のオブジェクトのフォームを読み込もうとすると、var_dump() および exit() コマンドが実行されませんでした。これがうまくいかない理由はまだわかりません。
影響を受けるクラスの preSave() および postLoad() 関数をオーバーライドします。#4 と同じ問題に遭遇しました: preSave() は正常に動作しましたが、postLoad() は失敗しました。
影響を受けるクラスで preSave() 関数をオーバーライドしてから、クラスの日時フィールドに関連する getter 関数をオーバーライドします。これは機能しますが、ゲッターを使用するのではなく、オブジェクトの内部 $_data 配列にアクセスして元の datetime 値を取得する場合のみです。セッターを呼び出すと、最終的にはフィールドのゲッターも呼び出されるようになり、適用するタイムゾーン変換が多すぎるため、これを行う必要があります。したがって、これは機能しますが、 $_data 配列へのアクセスは、壊れたくない巨大なハックのように感じます。
それを過ぎると、まだ検討していない理論的アプローチしかありません。たとえば、Symfony の datetime フィールド自体の定義を、Doctrine やその他のどこかで変更することはできますが、Doctrine のコアを深く掘り下げる必要がなければ、これを行う場所を思いつきませんでした。
この時点で、私たちは行き詰まっています。管理者に日付時刻を ET として表示させ、ET 日付時刻を UTC としてデータベースに保存させるだけでも、これは非常に多くの作業のように思えます。している。