@Drrcknlsn , bir zaman dizesini bir veri zamanına dönüştürmenin birden fazla yolu olduğunu iddia etmek için doğru olsa da , bu farklı yolların saat dilimlerini aynı şekilde ele almadığını anlamak önemlidir.
Seçenek 1 : DateTime('@' . $timestamp)
Aşağıdaki kodu göz önünde bulundurun:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
strtotime
Bit saat dilimi bilgilerini ortadan kaldırır ve date_create
fonksiyon GMT varsayar ( Europe/Brussels
).
Bu nedenle, hangi sunucuda çalıştırdığım önemli değil, çıktı aşağıdaki gibi olacaktır:
2011-12-12T13:17:52+00:00
Seçenek 2 : date_create()->setTimestamp($timestamp)
Aşağıdaki kodu göz önünde bulundurun:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Bunun aynı çıktıyı üretmesini bekleyebilirsiniz. Ancak, bu kodu bir Belçika sunucusundan çalıştırırsam, aşağıdaki çıktıyı alırım:
2011-12-12T14:17:52+01:00
date_create
İşlevin aksine, setTimestamp
yöntem 'Europe/Brussels'
GMT yerine sunucunun saat dilimini ( benim durumumda) varsayar .
Saat diliminizi açıkça belirleme
Çıktınızın girişinizin saat dilimiyle eşleştiğinden emin olmak istiyorsanız, en iyisi bunu açıkça ayarlamaktır.
Aşağıdaki kodu göz önünde bulundurun:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Şimdi, aşağıdaki kodu da göz önünde bulundurun:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Çıktının saat dilimini girdininkiyle eşleşecek şekilde açıkça ayarladığımız için, her ikisi de aynı (doğru) çıktıyı yaratacaktır:
2011-12-12T21:17:52+08:00