PHP'de datetime'ı ISO 8601'e nasıl dönüştürebilirim


104

Zamanımı 2010-12-30 23:21:46ISO 8601 tarih biçimine nasıl dönüştürebilirim? (-_-;)


1
@Gordon evet Yaklaşık 4.530 sonuç aldım ve @alex'ten bir yanıt buldum
wow

@wow lütfen 4530 sonuçlarından hiçbirinin sorunuzu neden yanıtladığını belirtin.
Gordon

1
@Gordon Hala A'dan Z'ye yazmayı öğreniyorum ama bana Z'den A'ya yazmayı öğrettiklerini öğrendim :)
wow

@wow Hayır. Size alfabe yazmayı öğretirler ($ from, $ to). Neredeyse hepsi size date($format, strtotime($dateString))ya da DateTimeeşdeğeri nesneyi kullanmanızı söylüyor . Yalnızca bu işlevlerin girdilerinde farklılık gösterirler. Tek yapmanız gereken , PHP Kılavuzundaki ilgili sayfalara gitmek ve girdinin ne olduğunu bulmaktır.
Gordon

3
@Gordon Evet haklısın. Sadece alfabeyi biliyordum ve şimdi arı zamanını yazıyorum. Umarım doğru okuldayımdır.
vay

Yanıtlar:


231

Nesne odaklı

Bu önerilen yoldur.

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

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

Prosedürel

PHP'nin eski sürümleri için veya yordamsal kod konusunda daha rahatsanız.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));

3
Soru, çıktı 2010-12-30T23:21:46+1100nasıl yapılacağıdır 2010-12-30T23:21:46+11:00?
vay

2
@wow Bunu dene preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Çıktı 2010-12-30T23:21:46+11:00.
alex


12
date('c', strtotime('2010-12-30 23:21:46'))güzel @Gordon :)
wow

8
Kullanmanın DATE_ISO8601ISO8601'den biraz farklı bir tarih dizesi ürettiğini (TZ'de iki nokta üst üste eksik, ISO8601 tüm zamanların iki nokta üst üste olmadan OR ile olmasını bekler, karışım değil) - date('c')sıkı bir ISO 8601 geçerli tarih üretir. - Kod katı bir ISO 8601 tarih saat biçimi bekliyorsa, bu durum izlenmesi zor hatalara neden olabilir. Ref: en.wikipedia.org/wiki/ISO_8601
ckm

38

PHP 5'ten sonra şunu kullanabilirsiniz: echo date("c");ISO 8601 formatlı datetime.

http://ideone.com/nD7piL

Yorumlar için not:

İlişkin bu , bu ifadelerin ikisi de temel biçimi için, diliminin için geçerlidir: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Ancak + 0X: 00'ın doğru olduğunu ve + 0X00'ün genişletilmiş kullanım için yanlış olduğunu unutmayın. Bu yüzden kullanmak daha iyidir date("c"). Benzer bir tartışma burada .


1
Aşağıdaki ile küçük farklılığa dikkat edin DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck

@ Ja͢ck bunun aşağı oylamaya ihtiyacı var mı? Küçük bir farklılık genellikle kötü bir fikirdir.
rybo111

@ rybo111 Bu yanıta olumsuz oy vermek için bir neden göremiyorum; Teknik olarak, hem 'c've DATE_ISO8601geçerli ISO8601 zaman temsillerini üretirler.
Ja͢ck

Cevaplamak için bir not ekledim.
trante

@ Ja͢ck DATE_ISO8601geçerli bir ISO8601 temsili üretmiyor. DATE_ATOM buna rağmen
Kaptan

4

ISO 8601'den unixtimestamp'a nasıl dönüştürülür:

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

Unixtimestamp'tan ISO 8601'e (saat dilimi sunucusu) dönüştürme:

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

Unixtimestamp'tan ISO 8601'e (GMT) dönüştürme:

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

Unixtimestamp'tan ISO 8601'e (özel saat dilimi) dönüştürme:

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


1

Datetime-local içinde bir değer ayarlamayı denerseniz

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

//output : 2010-12-30T23:21

Kabul edilen cevaba verilen yorumlarda da benzer bir çözümden bahsediliyor
sushant047

0

Bu şekilde deneyebilirsiniz:

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

echo $datetime->format(DATE_ATOM);

Ayrıca:

echo $datetime->format('c');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.