PHP 5.5.16 is released

DateTime::createFromFormat

date_create_from_format

(PHP 5 >= 5.3.0)

DateTime::createFromFormat -- date_create_from_formatDevuelve un nuevo objeto DateTime formateado según el formato especificado

Descripción

Estilo orientado a objetos

public static DateTime DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] )

Estilo por procedimientos

DateTime date_create_from_format ( string $format , string $time [, DateTimeZone $timezone ] )

Devuelve un nuevo objeto DateTime formateado según el formato especificado.

Parámetros

format

El formato en el que debería estar lo proporcionado en string. Véanse 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 caracteres son reconocidos en el string del parámetro format
Carácter de 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 (el cual se asume que esté en el rango 1970-2069, inclusive) Ejemplos: 99 o 03 (que serán representados como 1999 y 2003, respectivamente)
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 hasta 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: /
;, :, /, ., ,, -, ( o ) 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 el string 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 aún analizados Y-m-d| establecerá el año, mes y día a la información encontrada en el string a analizar, y establece la hora, minutos y segundos a 0.
+ Si este especificador de formato está presente, la información sobrante del string no causará un error, pero sí una advertencia en su lugar Use DateTime::getLastErrors() para averiguar si estuvo presente información sobrante.

Los caracteres no reconocidos en el string de formato causarán que falle el 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

Un string que representa la hora.

timezone

Un objeto DateTimeZone que representa la zona horaria deseada.

Si se omite timezone y time no contiene ninguna zona horaria, se usará la zona horaria en uso.

Nota:

El parámetro timezone y la zona horaria actual son ignoradas cuando el parámetro time contiene una marca de tiempo UNIX (p.ej. 946684800) o especifica una zona horaria (p.ej. 2010-01-28T15:00:00+02:00).

Valores devueltos

Devuelve una nueva instancia de DateTime o FALSE en caso de error.

Ejemplos

Ejemplo #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 procedimientos

<?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

Ejemplo #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

add a note add a note

User Contributed Notes 8 notes

up
21
falundir at gmail dot com
1 year ago
Be warned that DateTime object created without explicitely providing the time portion will have the current time set instead of 00:00:00.

<?php
$date
= DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_dump($date->format('Y-m-d H:i:s')); //will print 2012-10-17 13:57:34 (the current time)
?>

That's also why you can't safely compare equality of such DateTime objects:

<?php
$date1
= DateTime::createFromFormat('Y-m-d', '2012-10-17');
sleep(2);
$date2 = DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_dump($date1 == $date2); //will be false
var_dump($date1 >= $date2); //will be false
var_dump($date1 < $date2); //will be true
?>
up
10
kamil dot wegrzynowicz at baobaz dot com
2 years ago
It seems that a pipe ('|') option in formating string works only with PHP version 5.3.7 and newer. We had an issue with it on versions 5.3.2, 5.3.3, 5.3.6. Yet it was fine with 5.3.8 and 5.3.10.

By short example:
<?php
$timezone
= new DateTimeZone('UTC');
$dateTime = DateTime::createFromFormat('dmY|', '01011972', $timezone);
//$dateTime is FALSE in PHP v <5.3.8
?>

Instead we used a workaround:
<?php
$dateTime
= DateTime::createFromFormat('dmY', '01011972', $timezone);
$dateTime->format('Y-m-d 00:00:00');
?>
which works fine.

====

Modified by admin to correct for version (5.3.7 not 5.3.8)
up
10
d dot shankarnarayana at gmail dot com
4 months ago
Say if there is a string with  $date = "today is 2014 January 1";   and you need to extract "2014 January" using DateTime::createFromFormat().  As you can see in the string there is something odd like "today is" .Since that string (today is) does not correspond to a date format, we need to escape that.

In this case, each and every character on that string has to be escaped as shown below.

The code.

<?php
$paragraph
= "today is 2014 January 1";
$date = DateTime::createFromFormat('\t\o\d\a\y \i\s Y F j', $paragraph);
echo
$date->format('Y F'); //"prints" 2014 January

- Shankar Damodaran
up
3
mail at marcel-juenemann dot de
1 year ago
Note that the U option does not support negative timestamps (before 1970). You have to use date for that.
up
3
Aurelien Marchand
3 years ago
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

?>
up
5
thomas dot ribiere at allgoob dot com
1 year ago
Not a bug, but a strange issue today 2012-08-30 :

<?php
$date
= "2011-02";
echo
$date."\n";
$d = DateTime::createFromFormat("Y-m",$date);
echo
$d->format("Y-m");
?>
will display :
2011-02
2011-03

It's because there is no 2011-02-30, so datetime will take march insteed of february ...

To fix it :
<?php
$date
= "2011-02";
echo
$date."\n";
$d = DateTime::createFromFormat("Y-m-d",$date."-01");
echo
$d->format("Y-m");
?>
up
2
klugg at tlen dot pl
3 years ago
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"

?>
up
-2
nicodoggie at gmail dot com
1 month ago
I've found that on PHP 5.5.13 (not sure if it happens on other versions) if you enter a month larger than 12 on a format that takes numeric months, the result will be a DateTime object with its month equal to the number modulo 12 instead of returning false.

<?php
var_dump
(DateTime::createFromFormat('Y-m-d', '2013-22-01'));
?>

results in:
class DateTime#4 (3) {
  public $date =>
  string(19) "2014-10-01 13:05:05"
  public $timezone_type =>
  int(3)
  public $timezone =>
  string(3) "UTC"
}
To Top