Stempel Waktu PHP ke dalam DateTime

94

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.

JREAM
sumber

Jawaban:

163

Anda tidak perlu mengubah string menjadi stempel waktu untuk membuat DateTimeobjek (faktanya, konstruktornya bahkan tidak mengizinkan Anda melakukan ini, seperti yang Anda tahu). Anda cukup memasukkan string tanggal Anda ke dalam DateTimekonstruktor sebagaimana adanya:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Karena itu, jika Anda memiliki stempel waktu yang ingin Anda gunakan sebagai pengganti string, Anda dapat melakukannya menggunakan DateTime::setTimestamp():

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

Sunting (2014-05-07):

Aku benar-benar tidak menyadari hal ini pada saat itu, tetapi DateTimekonstruktor tidak mendukung menciptakan contoh langsung dari cap waktu. Menurut dokumentasi ini , yang perlu Anda lakukan hanyalah menambahkan stempel waktu dengan @karakter:

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
FtDRbwLXw6
sumber
Ini bekerja dengan baik. Saya telah mencoba ini sebelumnya tetapi pasti belum memberikan cukup kesempatan !!! terima kasih :))
JREAM
18
Perhatikan itu 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.
John Slegers
42

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 strtotimebit menghilangkan informasi zona waktu, dan date_createfungsi 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_createfungsinya, setTimestampmetode 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
John Slegers
sumber
27

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

Forsberg
sumber
2
Metode ini juga mengabaikan zona waktu
Bouke Versteegh
2
@ BoukeVersteegh dan mana yang tidak?
forsberg
2
@BoukeVersteegh Ini adalah stempel waktu Unix !, ini membebaskan Anda dari masalah zona waktu saat membuat objek . cukup gunakan ->setTimezoneuntuk menyetel zona waktu yang lebih disukai sebelum menelepon->format()
Akuntan م
1
@BoukeVersteegh Periksa catatan besar ini dari manual PHP "Parameter $ zona waktu dan zona waktu saat ini diabaikan ketika parameter $ waktu baik adalah stempel waktu UNIX (misalnya @ 946684800) atau menentukan zona waktu (misalnya 2010-01-28T15: 00: 00 + 02: 00). "
Akuntan م
1
Stempel waktu Unix tidak memiliki zona waktu, mereka selalu UTC menurut definisi
the_nuts
0

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);
    }
berbakat
sumber