Sorunun bazı nüanslarla ilgili olduğundan şüpheleniyorum strtotime().
strtotime()hemen hemen her dizeyi alıp bir Unix zaman damgasına dönüştürebilirsiniz. Sorun, dize açık bir saat dilimi içermiyorsa, tarafından ayarlananı kullanmasıdır date_default_timezone_get(). Bu geçerli kullanıcıdan ayarlanmalıdır (hesap proxy'si tarafından ayarlanır). Ancak, çektiğiniz dize $node->field_date->valuedolaylı olarak UTC'de. Başka bir deyişle, dize tarafından ayrıştırılıyor bence strtotime()'UTC / değil' Amerika / New_York 'olarak yorumlanmaktadır.
İyi haber şu ki durumunuzu çok basitleştirebilirsiniz. Tarih aralığı için alan öğesi dört bölümden oluşur
- 'değer', UTC'de dize olarak başlangıç tarihidir
- 'start_date', 'değeri' temsil eden bir DrupalDateTime nesnesidir
- 'end_value', UTC'de dize olarak bitiş tarihidir
- 'end_date', 'end_value'yu temsil eden bir DrupalDateTime nesnesidir
Düz tarih saat alanı için
- 'değer' UTC'de dize olarak tarih
- 'tarih', 'değeri' temsil eden bir DrupalDateTime nesnesidir
Böylece, DrupalDateTime()nesneyle doğrudan çalışabilirsiniz . Buna ek olarak, söz konusu date.formatterhizmet, sayfayı varsayılan olarak görüntüleyen kullanıcının kullandığı uygun saat dilimini de çekmelidir (kullanıcının etkin dilini kullanmaya ek olarak).
Bunun gibi bir şeyin işe yarayacağından şüpheleniyorum
$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'
);
Not Sistemin hangi saat diliminin kullanımda olduğunu düşündüğünü görebilmeniz için 'P' biçiminde yer tutucusu ekledim.
Yönetici / config / bölge / ayarlarında doğru saat dilimini ayarladığınızdan ve kullanıcı saat diliminizin beklediğiniz ayar olduğundan emin olun. Ayrıca php.ini dosyasında doğru saat dilimi ayarının yapılmış olduğundan emin olun ( date.timezoneayar budur); Bu ayarlanmadığında garip şeyler olur (Ve başımın üstünden, kurulumcuda veya durum raporunda ayarlanmadığında bir uyarıya neden olup olmadığını hatırlamıyorum. sorunu hatırlıyorum, ancak taahhüt).
dateDrupalDateTime erişim özelliği hakkında bilmiyordum . Meraktan nasıl anladınız? Alanımın bu türden olduğunu anlayabildim,DateTimeItemancak içeride bu sınıf için birdate(veyavalue) kamu üyesi olduğu açık görünmüyor .