標準のDrupal日付フィールド 'My date'(field_my_date)があります。その値を取得できます:
$node->field_my_date->value // returns: "2017-12-14T08:00:00"
しかし、「14.12.2017」のような形式の日付文字列を取得したいと思います。
インタラクティブシェル(drush core-cli)でフィールドを分析すると、 DateTimeFieldItemList オブジェクトまたは DateTimeItem オブジェクトを取得できることがわかります。
>>> $node->field_my_date
=> Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList {#8836
0: Drupal\datetime\Plugin\Field\FieldType\DateTimeItem {#8841},
}
>>> $node->field_my_date[0]
=> Drupal\datetime\Plugin\Field\FieldType\DateTimeItem {#8841
value: [
"value" => "2017-12-14T08:00:00",
],
}
しかし、日付文字列を再フォーマットする方法は見つかりませんでした。出力日付文字列の形式を定義する可能性はありますか?または、出力文字列を再フォーマットする必要がありますか?このような:
date("j.n.Y", strtotime($node->field_my_date->value));
日付フィールドには、UTCで日付を格納するvalue
と、getTimestamp()メソッドまたはformat()メソッドを使用できるDrupalDateTimeオブジェクトを返す計算フィールドdate
の2つのプロパティがあります。
// get unix timestamp
$timestamp = $node->field_date->date->getTimestamp();
// get a formatted date
$date_formatted = $node->field_date->date->format('Y-m-d H:i:s');
日付範囲フィールドの場合:
// formatted start date
$start_date_formatted = $node->field_date->start_date->format('Y-m-d H:i:s');
// formatted end date
$end_date_formatted = $node->field_date->end_date->format('Y-m-d H:i:s');
受け入れられた答えは良いですが、ここでNewDrupalDateTimeを使用したい人のためにいくつかの例を示します。
I.日付があり、それをフォーマットしたい場合は、次のようにクラス(DrupalDateTime)の静的メソッドに渡すだけです。文字列を日付変数に置き換えることができます。 DrupalDateTimeの静的バージョンと非静的バージョンの両方の使用を以下に示します
$date = DrupalDateTime::createFromFormat('j-M-Y', '20-Jul-2019');
// Using the static method prints out: 20-Jul-2019:11:am
$date = new DrupalDateTime('now'); // grab current dateTime using NON static
$date->format('l, F j, Y - H:i'); // format it
// prints out nicely formatted version: Tue, Jul 16, 2019 - 11:34:am
// you can remove H:i and what's after it if you don't want hours or am pm
$date = new DrupalDateTime('now'); // grab current dateTime
// Or print $date->format('d-m-Y: H:i A');
// prints out: 16-07-2019: 11:43 AM
その他の例:
$date = new DrupalDateTime();
$date->setTimezone(new \DateTimeZone('America/Chicago'));
print $date->format('m/d/Y g:i a');
// The above prints current time for given Timezone
// prints : 07/16/2019 10:59 am
// Another variations of the above except it takes specific date and UTC zone
$date = new DrupalDateTime('2019-07-31 11:30:00', 'UTC');
$date->setTimezone(new \DateTimeZone('America/Chicago'));
print $date->format('m/d/Y g:i a');
// prints 07/31/2019 6:30 am
これらをモジュール/コードで使用するには、ファイルの先頭に以下を含める必要があります。
use Drupal\Core\Datetime\DrupalDateTime;
Drushでテストする方法上記のコードをphpスクリプトに保存して、drushがブートストラップ後にsrciptを実行できるようにしますdrupalお気に入り:
drush -r /path-to-your-drupal-documentRoot -l example.com scr ~/path-to your-script
マルチサイトの場合、drush -lバージョンで http://example.com を使用していることを確認してください
次のY2Kタイプの問題(バイトがなくなるUNIXタイムスタンプフィールド)を回避するために、日付はSQLの日付フィールドに格納されます。エンティティオブジェクトは、ストレージメディア(SQL)から返される値と同じ値になります。
これを標準のレンダーコードを使用して表示すると、表示ウィジェットがフォーマットを処理します。これは、エンティティ表示フォームで設定できます。
コードでこれを行う場合は、フォーマットコードを自分で提供する必要があります。同様のコードでDateTimeオブジェクトを使用することは難しくありません。
$new_datetime = DateTime::createFromFormat ( "Y-m-d\TH:i:sT", $row["timestamp"] );
$formatted_date $new_datetime->format('j.n.Y');
これをtwigで行う方法はおそらくあるでしょうが、テンプレートのプリプロセスフックを使用する方がはるかに簡単です。