Come posso convertire datetime in ISO 8601 in PHP


103

Come si converte l'ora dal 2010-12-30 23:21:46formato di data ISO 8601? (-_-;)


1
@Gordon sì, ho ottenuto circa 4.530 risultati e ho trovato risposta da @alex
wow

@ wow, per favore, fai notare perché nessuno dei 4530 risultati ha risposto alla tua domanda.
Gordon

1
@Gordon sto ancora imparando a scrivere dalla A alla Z ma ho scoperto che mi insegnano a scrivere dalla Z alla A :)
wow

@ wow No. Ti insegnano a scrivere l'alfabeto ($ da, $ a). Quasi tutti ti dicono di usare date($format, strtotime($dateString))o l' DateTimeequivalente dell'oggetto. Differiscono solo nell'input a quelle funzioni. Tutto quello che devi fare è andare alle pagine corrispondenti nel manuale PHP e scoprire qual è l'input.
Gordon

3
@ Gordon Sì hai ragione. Conoscevo solo l'alfabeto e ora ho scritto l'ora delle api. Spero di essere nella scuola giusta.
wow

Risposte:


229

Orientato agli oggetti

Questo è il modo consigliato.

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

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

Procedurale

Per le versioni precedenti di PHP o se sei più a tuo agio con il codice procedurale.

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

3
Domanda, l'output è 2010-12-30T23:21:46+1100come farlo per essere 2010-12-30T23:21:46+11:00?
wow

2
@ wow Prova questo preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Emette 2010-12-30T23:21:46+11:00.
alex


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

8
Vorrei notare che l'utilizzo DATE_ISO8601produce una stringa di data leggermente diversa da ISO8601 (i due punti mancano nella TZ, ISO8601 si aspetta che i tempi siano tutti con OR tutti senza due punti, non una miscela) - date('c')produce una data valida ISO 8601 rigorosa - Ciò potrebbe causare bug difficili da rintracciare se il codice si aspetta un formato datetime ISO 8601 rigoroso. Rif: en.wikipedia.org/wiki/ISO_8601
ckm

38

Dopo PHP 5 puoi usare questo: dal echo date("c");formato datetime in formato ISO 8601.

http://ideone.com/nD7piL

Nota per i commenti:

Riguardo a questo , entrambe le espressioni sono valide per fuso orario, per formato di base: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Tieni presente che + 0X: 00 è corretto e + 0X00 non è corretto per l'utilizzo prolungato. Quindi è meglio usare date("c"). Una discussione simile qui .


1
Notare la leggera differenza con DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck

@ Ja͢ck ha bisogno di una votazione negativa, allora? Una leggera differenza di solito è una cattiva idea.
rybo111

@ rybo111 Non vedo un motivo per votare questa risposta; tecnicamente, entrambi 'c'e DATE_ISO8601producono rappresentazioni temporali ISO8601 valide.
Ja͢ck

Ho aggiunto una nota per rispondere.
trante

@ Ja͢ck DATE_ISO8601non produce una rappresentazione ISO8601 valida. DATE_ATOM lo fa però
Captain Ovvio

4

Come convertire da ISO 8601 a unixtimestamp:

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

Come convertire da unixtimestamp a ISO 8601 (server del fuso orario):

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

Come convertire da unixtimestamp a ISO 8601 (GMT):

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

Come convertire da unixtimestamp a ISO 8601 (fuso orario personalizzato):

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


1

Se provi a impostare un valore in datetime-local

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

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

Una soluzione simile è menzionata nei commenti forniti alla risposta accettata
sushant047
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.