一月 23, 2020 | 後端和Drupal
【D8 HardCode教學】如何寫入日期資料到Date欄位之中
在D7,寫入日期欄位是件容易的事情,可以直接使用Date函數將值寫入或是用timestamp寫入欄位即可,但是到了D8,你會發現,不管你如何寫入日期到欄位,總是少了幾個小時的時間,但是寫入的資料卻是對的,到底發生什麼事情呢?
前言
在D7,寫入日期欄位是件容易的事情,可以直接使用Date函數將值寫入或是用timestamp寫入欄位即可,但是到了D8,你會發現,不管你如何寫入日期到欄位,總是少了幾個小時的時間,但是寫入的資料卻是對的,到底發生什麼事情呢?
作法
到了D8,要處理日期的相關資料,會通過DrupalDateTime這個類別(Class),以下範例,主要是將日期轉換成可以寫入到D8資料庫的各式。
範例:將台灣時間 2020年01月20號20:00存入日期欄位
- 使用
DrupalDateTime::createFromTimestamp
建立日期各式 - 使用DATETIME_DATETIME_STORAGE_FORMAT轉換為儲存用的各式
- 存進日期欄位之中
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
// Inser value to date field.
public function createEntity(){
// 轉換日期為 Timestamp
$date = DrupalDateTime::createFromTimestamp(strtotime('202001202000'), new \DateTimezone(DateTimeItemInterface::STORAGE_TIMEZONE));
$dateTime = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
$article = \Drupal::entityTypeManager()->getStorage('node')->create([
'type' => 'article',
'name' => 'sample title'
]);
$article->set('field_datefield', $dateTime);
$article->save();
}
DateTimeItemInterface::STORAGE_TIMEZONE
將會將資料轉換為儲存用的時區- DATETIME_DATETIME_STORAGE_FORMAT 將會將各式轉換成為儲存用的各式,其實就是
Y-m-d\TH:i:s
備註
後來發現實際存到資料庫的時候,其實並不是存當下的時間,而是UTC時間,而系統在呈現的時候,則會根據我們的時區,直接+8以後呈現,若這個部分忽略掉了,則會發現資料怎麼都是錯誤的囉。