web-dev-qa-db-ja.com

DateTimeItemオブジェクトからフォーマットされた日付文字列を取得する方法

標準の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));
6

日付フィールドには、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');
22
4k4

受け入れられた答えは良いですが、ここで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 を使用していることを確認してください

1
Salah-1

次の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で行う方法はおそらくあるでしょうが、テンプレートのプリプロセスフックを使用する方がはるかに簡単です。

1
CG Monroe