Saya menduga masalahnya ada hubungannya dengan beberapa nuansa strtotime()
.
strtotime()
dapat mengambil sembarang string, dan mengubahnya menjadi cap waktu Unix. Masalahnya adalah bahwa ketika string tidak mengandung zona waktu eksplisit, itu akan menggunakan apa yang ditetapkan oleh date_default_timezone_get()
. Itu harus ditetapkan dari pengguna saat ini, (itu diatur oleh proksi akun). Namun, string yang Anda tarik $node->field_date->value
secara implisit dalam UTC. Dengan kata lain, saya pikir string sedang diurai oleh strtotime()
sedang ditafsirkan sebagai di 'Amerika / New_York' dan bukan 'UTC'.
Kabar baiknya adalah Anda dapat menyederhanakan situasi Anda banyak. Item bidang untuk rentang tanggal terdiri dari empat bagian
- 'value' adalah tanggal mulai sebagai string dalam UTC
- 'start_date' adalah objek DrupalDateTime yang mewakili 'nilai'
- 'end_value' adalah tanggal akhir sebagai string dalam UTC
- 'end_date' adalah objek DrupalDateTime yang mewakili 'end_value'
Untuk bidang waktu tanggal polos mereka
- 'value' adalah tanggal sebagai string dalam UTC
- 'date' adalah objek DrupalDateTime yang mewakili 'nilai'
Jadi, Anda bisa bekerja dengan DrupalDateTime()
objek secara langsung. Selain itu, date.formatter
layanan itu harus menggunakan zona waktu yang tepat yang digunakan oleh pengguna melihat halaman secara default (selain menggunakan bahasa aktif pengguna).
Saya kira sesuatu seperti ini akan berhasil
$node = Node::load(2100);
$start_date = $node->field_date->start_date;
$formatted = \Drupal::service('date.formatter')->format(
$start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s P'
);
Catatan saya menambahkan placeholder format 'P' di sana sehingga Anda dapat melihat zona waktu apa yang digunakan sistem.
Pastikan Anda memiliki pengaturan zona waktu yang tepat di admin / config / regional / pengaturan, dan zona waktu pengguna Anda sesuai dengan yang Anda harapkan. Juga pastikan bahwa Anda memiliki zona waktu yang tepat di php.ini Anda (ini adalah date.timezone
pengaturannya); hal-hal aneh terjadi ketika ini tidak disetel (Dan jauh di atas kepala saya, saya tidak ingat apakah itu menyebabkan peringatan di installer atau pada laporan status ketika tidak disetel. Saya ingat masalah ini, tetapi tidak masalah apakah itu didapat berkomitmen).
date
fitur untuk mengakses DrupalDateTime. Karena penasaran bagaimana Anda mengetahui hal ini? Saya bisa mengetahui bahwa bidang saya adalah tipeDateTimeItem
tetapi dalam sana tidak tampak jelas bahwa adadate
(atauvalue
) anggota publik untuk kelas itu.