一月 23, 2020 | 後端和Drupal

【D8 HardCode教學】如何寫入日期資料到Date欄位之中

在D7,寫入日期欄位是件容易的事情,可以直接使用Date函數將值寫入或是用timestamp寫入欄位即可,但是到了D8,你會發現,不管你如何寫入日期到欄位,總是少了幾個小時的時間,但是寫入的資料卻是對的,到底發生什麼事情呢?

前言

在D7,寫入日期欄位是件容易的事情,可以直接使用Date函數將值寫入或是用timestamp寫入欄位即可,但是到了D8,你會發現,不管你如何寫入日期到欄位,總是少了幾個小時的時間,但是寫入的資料卻是對的,到底發生什麼事情呢?

作法

到了D8,要處理日期的相關資料,會通過DrupalDateTime這個類別(Class),以下範例,主要是將日期轉換成可以寫入到D8資料庫的各式。

範例:將台灣時間 2020年01月20號20:00存入日期欄位

  1. 使用DrupalDateTime::createFromTimestamp建立日期各式
  2. 使用DATETIME_DATETIME_STORAGE_FORMAT轉換為儲存用的各式
  3. 存進日期欄位之中
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以後呈現,若這個部分忽略掉了,則會發現資料怎麼都是錯誤的囉。

Reference