¿Cómo convierto datetime a ISO 8601 en PHP?

103

¿Cómo convierto mi hora 2010-12-30 23:21:46al formato de fecha ISO 8601? (-_-;)

Guau
fuente
1
@Gordon sí, obtuve alrededor de 4530 resultados y encontré la respuesta de @alex
wow
@ wow, indique por qué ninguno de los 4530 resultados respondió a su pregunta.
Gordon
1
@Gordon Todavía estoy aprendiendo cómo escribir de la A a la Z, pero me pareció que me enseñan cómo escribir de la Z a A :)
wow
@ wow No. Te enseñan a escribir el alfabeto ($ desde, $ hasta). Casi todos te dicen que uses date($format, strtotime($dateString))o el DateTimeobjeto equivalente. Solo difieren en la entrada a esas funciones. Todo lo que tiene que hacer es ir a las páginas correspondientes en el Manual de PHP y averiguar cuál es la entrada.
Gordon
3
@Gordon Sí, tienes razón. Solo sabía el alfabeto y ahora deletreaba el tiempo del concurso. Espero estar en la escuela adecuada.
wow

Respuestas:

229

Orientado a objetos

Esta es la forma recomendada.

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

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

Procesal

Para versiones anteriores de PHP, o si se siente más cómodo con el código de procedimiento.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
alex
fuente
3
Pregunta, el resultado es 2010-12-30T23:21:46+1100¿cómo hacerlo 2010-12-30T23:21:46+11:00?
wow
2
@wow Prueba esto preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Produce 2010-12-30T23:21:46+11:00.
alex
12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
wow
8
Me gustaría señalar que el uso DATE_ISO8601produce una cadena de fecha que es ligeramente diferente a ISO8601 (faltan los dos puntos en el TZ, ISO8601 espera que los tiempos sean todos con O todos sin los dos puntos, no una mezcla) - date('c')produce una fecha válida estricta de ISO 8601 - Esto podría ocasionar errores de rastreo difíciles si el código espera un formato de fecha y hora ISO 8601 estricto. Ref: en.wikipedia.org/wiki/ISO_8601
ckm
38

Después de PHP 5, puede usar esto: echo date("c");formulario ISO 8601 con formato de fecha y hora.

http://ideone.com/nD7piL

Nota para comentarios:

Con respecto a esto , ambas expresiones son válidos para la zona horaria, para el formato básico: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Pero tenga en cuenta que + 0X: 00 es correcto y + 0X00 es incorrecto para uso prolongado. Entonces es mejor usar date("c"). Una discusión similar aquí .

trante
fuente
1
Note la ligera diferencia con DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck
@ Ja͢ck, ¿esto necesita una votación negativa, entonces? Una pequeña diferencia suele ser una mala idea.
rybo111
@ rybo111 No veo una razón para rechazar esta respuesta; técnicamente, ambos 'c'y DATE_ISO8601producen representaciones de tiempo ISO8601 válidas.
Ja͢ck
Agregué una nota para responder.
trante
@ Ja͢ck DATE_ISO8601no produce una representación ISO8601 válida. Sin embargo, DATE_ATOM lo hace
Captain Obvious
3

Cómo convertir de ISO 8601 a unixtimestamp:

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

Cómo convertir de unixtimestamp a ISO 8601 (servidor de zona horaria):

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

Cómo convertir de unixtimestamp a ISO 8601 (GMT):

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

Cómo convertir de unixtimestamp a ISO 8601 (zona horaria personalizada):

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
fuente
1

Si intenta establecer un valor en datetime-local

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

//output : 2010-12-30T23:21
Rúbia Alves
fuente
Se menciona una solución similar en los comentarios dados a la respuesta aceptada
sushant047