Apakah Anda tahu bagaimana saya bisa mengubahnya menjadi strtotime, atau jenis nilai serupa untuk diteruskan ke objek DateTime ?
Tanggal saya punya:
Mon, 12 Dec 2011 21:17:52 +0000
Apa yang saya coba:
$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');
Di atas tidak benar. Jika saya mengulang melalui banyak tanggal yang berbeda, semua tanggalnya sama.
sumber
new DateTime('@' . $timestamp)
dan$dt = new DateTime(); $dt->setTimestamp($timestamp)
jangan berurusan dengan zona waktu dengan cara yang sama. Lihat jawaban saya @ stackoverflow.com/questions/12038558/… untuk lebih jelasnya.Meskipun @drrcknlsn benar untuk menyatakan bahwa ada beberapa cara untuk mengonversi string waktu menjadi datatime, penting untuk disadari bahwa cara yang berbeda ini tidak menangani zona waktu dengan cara yang sama.
Pilihan 1 :
DateTime('@' . $timestamp)
Perhatikan kode berikut:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
The
strtotime
bit menghilangkan informasi zona waktu, dandate_create
fungsi mengasumsikan GMT (Europe/Brussels
).Dengan demikian, hasilnya adalah sebagai berikut, di server mana pun saya menjalankannya:
2011-12-12T13:17:52+00:00
Pilihan 2 :
date_create()->setTimestamp($timestamp)
Perhatikan kode berikut:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Anda mungkin berharap ini menghasilkan keluaran yang sama. Namun, jika saya menjalankan kode ini dari server Belgia, saya mendapatkan output berikut:
2011-12-12T14:17:52+01:00
Berbeda dengan
date_create
fungsinya,setTimestamp
metode ini mengasumsikan zona waktu server ('Europe/Brussels'
dalam kasus saya) daripada GMT.Menyetel zona waktu Anda secara eksplisit
Jika Anda ingin memastikan keluaran sesuai dengan zona waktu masukan Anda, sebaiknya setel secara eksplisit.
Perhatikan kode berikut:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Nah, perhatikan juga kode berikut ini:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Karena kami secara eksplisit mengatur zona waktu dari output agar sesuai dengan input, keduanya akan membuat output yang sama (benar):
2011-12-12T21:17:52+08:00
sumber
Mungkin solusi paling sederhana hanyalah:
DateTime::createFromFormat('U', $timeStamp);
Di mana 'U' berarti zaman Unix. Lihat dokumen: http://php.net/manual/en/datetime.createfromformat.php
sumber
->setTimezone
untuk menyetel zona waktu yang lebih disukai sebelum menelepon->format()
ini solusi saya:
function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") { $date = new DateTime($date, new DateTimeZone($from)); $date->setTimeZone(new DateTimeZone($to)); return $date->format($targetFormat); }
sumber