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.DateTimeItem::propertyDefinitions()
, Anda akan melihat apa yang terbuka. Kemudian lihatDateTimeComputed::getValue()
untuk melihat bagaimana itu bekerja. Semua kelas Item dapat diperiksa dengan cara itu, tetapi hanya sedikit yang menggunakan nilai yang dihitung. Saya berharap ada cara yang lebih baik untuk mengekspos ini ke API.DateTimeItem::propertyDefinitions()
. Saya pikir ada beberapa metode ajaib yang terjadi, tetapi ingin memahami bagaimana ini dibuat sehingga saya bisa lebih memahami cara mengakses bidang lain juga. Seperti yang Anda katakan, alangkah baiknya jika API dibuka, tetapi ini membantu. Terima kasih lagi.$node->field_date->date
, bukan$node->field_date->start_date
.Berbasis di Menangani konversi zona waktu dengan PHP DateTime saya mengubah kode saya menjadi ini:
Dan sekarang tanggal keluaran saya baik-baik saja:
Ini bekerja. Tapi saya yakin ada cara untuk melakukan ini menggunakan Drupal API.
sumber
date_default_timezone_set(drupal_get_user_timezone());
Saya biasanya menyelesaikannya dengan cara ini .:
sumber
Ini bekerja untuk saya:
sumber
Kode ini berfungsi untuk saya.
sumber
Tidak satu pun dari jawaban lain ini yang berhasil untuk saya. Inilah yang akhirnya saya dapatkan dengan:
sumber
Saya menggunakan cuplikan ini untuk bekerja dengan tanggal:
Anda bisa mendapatkan informasi lebih lanjut tentang objek Datetime di sini
sumber