Bagaimana cara mengubah datetime ke ISO 8601 di PHP

103

Bagaimana cara mengubah waktu saya dari 2010-12-30 23:21:46ke format tanggal ISO 8601? (-_-;)

Wow
sumber
1
@Gordon ya saya mendapat sekitar 4.530 hasil dan saya menemukan jawaban dari @alex
wow
@ wow tolong tunjukkan mengapa tidak ada dari 4530 hasil menjawab pertanyaan Anda.
Gordon
1
@Gordon Saya masih belajar bagaimana menulis dari A ke Z tetapi saya menemukan mereka mengajari saya bagaimana menulis dari Z ke A :)
wow
@ Wow Tidak. Mereka mengajari Anda cara menulis alfabet ($ dari, $ ke). Hampir semuanya memberitahu Anda untuk menggunakan date($format, strtotime($dateString))atau DateTimeobjek yang setara. Mereka hanya berbeda dalam masukan untuk fungsi-fungsi tersebut. Yang harus Anda lakukan adalah pergi ke halaman yang sesuai dalam Manual PHP dan mencari tahu apa inputnya.
Gordon
3
@ Gordon Ya, apakah Anda benar. Saya hanya tahu alfabet dan sekarang mengeja waktu lebah. Semoga saya di sekolah yang tepat.
wow

Jawaban:

229

Berorientasi pada objek

Ini cara yang direkomendasikan.

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

Prosedural

Untuk versi PHP yang lebih lama, atau jika Anda lebih nyaman dengan kode prosedural.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
alex
sumber
3
Pertanyaannya, outputnya 2010-12-30T23:21:46+1100bagaimana membuatnya menjadi 2010-12-30T23:21:46+11:00?
wow
2
@wow Coba ini preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Ini menghasilkan 2010-12-30T23:21:46+11:00.
alex
12
date('c', strtotime('2010-12-30 23:21:46'))bagus @Gordon :)
wow
8
Saya akan mencatat bahwa menggunakan DATE_ISO8601menghasilkan string tanggal yang sedikit berbeda dari ISO8601 (titik dua hilang di TZ, ISO8601 mengharapkan waktu menjadi semua dengan ATAU semua tanpa titik dua, bukan campuran) - date('c')menghasilkan tanggal valid ISO 8601 yang ketat - Hal ini dapat menyebabkan bug sulit dilacak jika kode mengharapkan format tanggal waktu ISO 8601 yang ketat. Ref: en.wikipedia.org/wiki/ISO_8601
ckm
38

Setelah PHP 5 Anda dapat menggunakan ini: echo date("c");format ISO 8601 datetime.

http://ideone.com/nD7piL

Catatan untuk komentar:

Sehubungan dengan ini , kedua ekspresi ini berlaku untuk zona waktu, untuk format dasar: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Tetapi perhatikan bahwa, + 0X: 00 benar, dan + 0X00 salah untuk penggunaan yang diperpanjang. Jadi lebih baik digunakan date("c"). Diskusi serupa di sini .

trante
sumber
1
Perhatikan sedikit perbedaan dengan DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck
@ Ja͢ck apakah ini perlu down-voting? Sedikit perbedaan biasanya merupakan ide yang buruk.
rybo111
@ rybo111 Saya tidak melihat alasan untuk menolak jawaban ini; secara teknis, keduanya 'c'dan DATE_ISO8601menghasilkan representasi waktu ISO8601 yang valid.
Ja͢ck
Saya menambahkan catatan untuk menjawab.
trante
@ Ja͢ck DATE_ISO8601tidak menghasilkan representasi ISO8601 yang valid. DATE_ATOM melakukannya
Captain Obvious
4

Bagaimana mengkonversi dari ISO 8601 ke unixtimestamp:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

Cara mengonversi dari unixtimestamp ke ISO 8601 (server zona waktu):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

Cara mengonversi dari unixtimestamp ke ISO 8601 (GMT):

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

Cara mengonversi dari unixtimestamp ke ISO 8601 (zona waktu khusus):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00
John Slegers
sumber
1

Jika Anda mencoba menetapkan nilai di datetime-local

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21
Rúbia Alves
sumber
Solusi serupa disebutkan dalam komentar yang diberikan untuk jawaban yang diterima
sushant047