Beware specifying a timezone in the format as it will take precedence over the DateTimeZone object.
<?php
$timezone = "UTC"; // or any other valid name for a timezone
$d= DateTime::createFromFormat("Y-m-d H:i:s T","2011-11-06 00:00:00 EDT",new DateTimeZone($timezone));
echo $d->format("Y-m-d H:i:s T - U");
// returns "2011-11-06 00:00:00 EDT - 1320552000"
// specifying $timezone = "Pacific/Honolulu"; would return the same string
?>
This gets hairy when you are playing with transition from summer time to winter time! For instance, in Toronto, the time change happens on 2011-11-06. One second after 01:59:59 (EDT), the time becomes 01:00:00 (EST), or 1320559200 in Unix timestamp.
However, notice the following:
<?php
$d = DateTime::createFromFormat("Y-m-d H:i:s","2011-11-06 01:00:00",new DateTimeZone("EST"));
echo $d->format("Y-m-d H:i:s T U");
// returns "2011-11-06 01:00:00 EDT 1320555600" instead of "2011-11-06 01:00:00 EST 1320559200"
// so the correct way is to do:
$d = DateTime::createFromFormat("Y-m-d H:i:s T","2011-11-06 01:00:00 EST",new DateTimeZone($timezone)); // set $timezone to any valid string for DateTimeZone, it doesn't matter
echo $d->format("Y-m-d H:i:s T U");
// returns "2011-11-06 01:00:00 EST - 1320559200" as wanted
?>
DateTime::createFromFormat
(PHP 5 >= 5.3.0)
DateTime::createFromFormat — Devuelve un nuevo objeto DateTime formateado según el formato especificado
Descripción
Estilo orientado a objetos
Estilo por procesos
Devuelve un nuevo objeto DateTime formateado según el formato especificado.
Parámetros
- format
-
El formato en el que debería estar lo pasado en string. Véase las opciones de formateo más abajo. En la mayoría de los casos se pueden usar las mismas letras que para date().
Los siguientes caracters son reconocidos en la cadena parámetro format Carácter format Descripción Ejemplo de valores analizables Día --- --- d y j Día del mes, 2 dígitos con o sin ceros iniciales 01 a 31 o 1 a 31 D y l Una representación textual de un día Mon hasta Sun o Sunday hasta Saturday S Sufijo ordinal inglés para el día del mes, 2 caracteres. Se ignora mientras se procesa. st, nd, rd o th. z El día del año (comenzando por 0) 0 hasta 365 Mes --- --- F y M Una representación textual de un mes, como January o Sept January hasta December o Jan hasta Dec m y n Representación numérica de un mes, con o sin ceros iniciales 01 hasta 12 o 1 hasta 12 Año --- --- Y Una representación numérica completa de un año, 4 dígitos Ejemplos: 1999 o 2003 y Una representación de dos dígitos de un año Ejemplos: 99 o 03 Hora --- --- a y A Ante meridiem y Post meridiem am o pm g y h Formato de 12 horas de una hora con o sin ceros iniciales 1 hasta 12 o 01 hasta 12 G y H Formato de 24 horas de una hora con o sin ceros iniciales 0 hasta 23 o 00 hasta 23 i Minutos con ceros iniciales 00 a 59 s Segundos, con ceros iniciales 00 hasta 59 u Microsegundos (hasta seis dígitos) Ejemplo: 45, 654321 Zona Horaria --- --- e, O, P y T Identificador de zona horaria, o diferencia con UTC en horas, o diferencia con UTC con dos puntos entre horas y minutos, o abreviatura de la zona horaria Ejemplos: UTC, GMT, Atlantic/Azores o +0200 o +02:00 o EST, MDT Fecha/Hora Completas --- --- U Segundos desde la Época Unix (January 1 1970 00:00:00 GMT) Ejemplo: 1292177455 Espacios en Blanco y Separadores --- --- (espacio) Un espacio o una tabulación Ejemplo: # Uno de los siguientes símbolos de separación: ;, :, /, ., ,, -, ( o ) Ejemplo: / ;, :, /, ., ,, -, ( or ) El carácter especificado. Ejemplo: - ? Un byte aleatorio Ejemplo: ^ (Sea consciente de que para los caracteres UTF-8 debería necesitar más de un ?. En este caso es probable que quiera usar * en su lugar) * Bytes aleatorios hasta el siguiente separador o dígito Ejemplo: * en Y-*-d con la cadena 2009-aWord-08 coincidirá con aWord ! Reinicia todos los campos (año, mes, día, hora, minuto, segundo, fracción e información de la zona horaria) a la Época Unix Sin !, todos los campos serán establecidos a la fecha y hora actuales. | Reinicia todos los campos (año, mes, día, hora, minuto, segundo, fracción e información de la zona horaria) a la Época Unix si no han sido ya analizados Y-m-d| establecerá el año, mes y día a la información encontrada en la cadena a analizar, y establece la hora, minutos y segundos a 0. + Si este especificador de formato está presente, la información sobrante de la cadena no causará un error, pero sí una advertencia en su lugar Use DateTime::getLastErrors() para averiguar si está presente información sobrante. Los caracteres no reconocidos en la cadena de formato causarán el fallo del análisis y se añadirá un mensaje de error a la esctructura devuelta. Puede consultar los mensajes de error con DateTime::getLastErrors().
Si format no contiene el carácter !, las partes del momento generado que no estén especificadas en format serán establecidas al momento actual del sistema.
Si format contiene el carácter !, las partes del momento generadas no proporcionadas en format, así como los valores más a la izquierda de !, serán establecidos a los valores correspondientes de la época Unix.
La época Unix es 1970-01-01 00:00:00 UTC.
- time
-
Una cadena que representa la hora.
- timezone
-
Un objeto DateTimeZone que representa la zona horaria deseada.
Valores devueltos
Devuelve una nueva instancia de DateTime o FALSE en caso de error.
Ejemplos
Example #1 Ejemplo de DateTime::createFromFormat()
Estilo orientado a objetos
<?php
$fecha = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $fecha->format('Y-m-d');
?>
Estilo por procesos
<?php
$fecha = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($fecha, 'Y-m-d');
?>
El resultado de los ejemplos serían:
2009-02-15
Example #2 Complejidades de DateTime::createFromFormat()
<?php
echo 'Momento actual: ' . date('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-d';
$fecha = DateTime::createFromFormat($formato, '2009-02-15');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-d H:i:s';
$fecha = DateTime::createFromFormat($formato, '2009-02-15 15:16:17');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = 'Y-m-!d H:i:s';
$fecha = DateTime::createFromFormat($formato, '2009-02-15 15:16:17');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
$formato = '!d';
$fecha = DateTime::createFromFormat($formato, '15');
echo "Formato: $formato; " . $fecha->format('Y-m-d H:i:s') . "\n";
?>
El resultado del ejemplo sería algo similar a:
Momento actual: 2010-04-23 10:29:35 Formato: Y-m-d; 2009-02-15 10:29:35 Formato: Y-m-d H:i:s; 2009-02-15 15:16:17 Formato: Y-m-!d H:i:s; 1970-01-15 15:16:17 Formato: !d; 1970-01-15 00:00:00
Ver también
- DateTime::__construct() - Devuelve un nuevo objeto DateTime
- DateTime::getLastErrors() - Devuelve las advertencias y los errores
- checkdate() - Validar una fecha gregoriana
In order to use a DateTimeZone, don't enter one of the DateTimeZone::Europe, DateTimeZone::Asia etc. constants, but create a DateTimeZone object with verbal timezone name passed as a string:
<?php
$eventDate = DateTime::createFromFormat('m/d/y h:i', '02/26/11 08:00', new DateTimeZone('Europe/Warsaw'));
echo date_format($eventDate, 'Y-m-d'); //prints "2011-02-26"
?>
You can use the ISO8601 constant instead:
$date = DateTime::createFromFormat(DateTime::ISO8601, date("c"))
You can view the other constants at:
http://php.net/manual/en/class.datetime.php
This function seems to not support ISO 8601 format yet.
This fixe solves the problems:
use format : "Y-m-d\TH:i:sP"
