web-dev-qa-db-ja.com

日付フィールドの間違った時間値

Drupalに前処理したい日付フィールドがあります。残念ながら

_$node->field_date_time->value;
_

1時間(値が9:00であると予想される場合は8:00)の値を与えます。 Drupalは日付を保存する方法と後で表示する方法(タイムゾーンを考慮に入れて)に問題があると思います。デフォルトのタイムゾーンをDateTimeオブジェクトに渡してみましたが、また、\Drupal::service('date.formatter')を使用して日付をフォーマットしようとしましたが、結果はまだオフです。

デバッグするとき、私はそれを使用してそれを見つけました:

_$node->field_date_time->date
_

保護されたDateTimeObjectプロパティの下で予定日を確認できます(スクリーンショットを参照)。 enter image description here

誰かがそれを抽出する方法を知っていますか、それとも私が見逃しているものがあるのでしょうか?実行中Drupal 8.1.9

2
SpuriouslyAwake

日付フィールドを表示する場合、Drupalは通常、現在ログインしているユーザーのタイムゾーンに変換します。ログインしているユーザーがいない場合は、サイトのデフォルトのタイムゾーンが使用されます。別のタイムゾーンが設定されているユーザーですか?

また、時刻は内部でUTCとして保存されているため、日付の値を印刷したり、デバッガーを使用したりすると、1時間ずれた時刻が表示されます。ユーザーのタイムゾーンで時刻を出力したい場合は、次のようにしてください:

\Drupal::service('date.formatter')->format($date->getTimestamp());

これは、ユーザーのタイムゾーンを使用するか、サイトのデフォルトのタイムゾーンにフォールバックします。

2
hampercm

$value = $node->field_date_time->value;で取得される値は、UTCに格納されている日時値です。

この文字列をDateTimeオブジェクトに変換した場合

$ date =新しいDrupalDateTime($ value)

次に、サイト(ヨーロッパ/ダブリン)にデフォルトのタイムゾーンが設定されたDatetimeオブジェクトを取得します。正しいdatetimeオブジェクトを確実に保持するには、UTC TimeZoneを使用してDateTimeオブジェクトを作成する必要があります

$ date = new DrupalDateTime($ value、new DateTimeZone( 'UTC'));

そして、datetimeをDefault TimeZoneサイトに変換するdate.formatterサービスによって、日付オブジェクトを正しくフォーマットできます。

1
flocondetoile