Función PHP date_create_from_format: Sintaxis y Ejemplos
Aprende a usar date_create_from_format en PHP para crear objetos DateTime desde cadenas con formatos no estándar, con ejemplos y manejo de errores.
La función date_create_from_format() analiza una cadena de fecha escrita en tu formato — no solo los formatos que PHP intenta adivinar — y devuelve un objeto DateTime. Úsala siempre que recibas una fecha en un diseño fijo y no estándar (una exportación CSV, una API de terceros, un formulario de usuario) y necesites interpretarla de forma confiable.
Esta página cubre la sintaxis, ejemplos ejecutables, el parámetro de zona horaria, cómo detectar fallos de análisis y cómo se diferencia la función de strtotime() y date_parse_from_format().
Sintaxis
date_create_from_format(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false$format— el diseño de la cadena de entrada, escrito con los mismos caracteres de formato que la funcióndate(). Por ejemplo,"Y-m-d H:i:s"coincide con"2023-03-02 17:30:45".$datetime— la cadena de fecha a analizar. Su diseño debe coincidir con$format.$timezone— (opcional) unDateTimeZonepara el objeto resultante. Si se omite, se usa la zona horaria predeterminada actual (establecida mediantedate_default_timezone_set()). El parámetro se ignora si$formatya contiene un carácter de zona horaria comoe,O,PoT.
Devuelve un objeto DateTime en caso de éxito, o false si la cadena no coincide con el formato.
date_create_from_format()es el alias procedimental del método estáticoDateTime::createFromFormat()— se comportan de forma idéntica.
Ejemplos
Análisis de una cadena de fecha estándar
La función lee "2023-03-02 17:30:45" según "Y-m-d H:i:s" y devuelve un objeto DateTime. Al llamar a format() sobre él puedes volver a representar la fecha en el diseño que desees.
Reformateo de una fecha no estándar
Aquí la entrada usa un día, un nombre de mes de tres letras y un año de cuatro dígitos (j-M-Y). La salida se representa en orden ISO (Y-m-d) — prueba de que, una vez que una fecha es un objeto DateTime, puedes mostrarla como quieras.
Restablecimiento de la hora con !
Si tu formato no tiene campos de hora, las partes que faltan toman como valor predeterminado la hora, el minuto y el segundo actuales — lo cual raramente es lo que quieres para un valor de solo fecha. Agrega como prefijo ! al formato para restablecer todos los campos no especificados al epoch de Unix (00:00:00):
<?php
$date = date_create_from_format('!Y-m-d', '2023-03-02');
echo $date->format('Y-m-d H:i:s'); // Output: 2023-03-02 00:00:00Suministro de una zona horaria
<?php
$tz = new DateTimeZone('Europe/Paris');
$date = date_create_from_format('Y-m-d H:i:s', '2023-03-02 17:30:45', $tz);
echo $date->format('Y-m-d H:i:s P'); // Output: 2023-03-02 17:30:45 +01:00El tercer argumento ancla la fecha analizada a la hora de París, por lo que el token P informa el desplazamiento +01:00.
Manejo de fallos de análisis
Cuando la cadena no coincide con el formato, la función devuelve false en lugar de lanzar una excepción. Comprueba siempre este caso y lee DateTime::getLastErrors() para obtener los detalles:
<?php
$date = date_create_from_format('Y-m-d', 'not-a-date');
if ($date === false) {
$errors = DateTime::getLastErrors();
echo "Parse failed: {$errors['error_count']} error(s)\n";
// Output: Parse failed: 3 error(s)
}Como false es falsy, un simple if (!$date) también funciona — pero una comprobación estricta === false es más segura cuando un valor vacío podría legítimamente significar otra cosa.
Comparación con otras funciones de fecha
| Función | Entrada | Devuelve |
|---|---|---|
date_create_from_format() | string + formato explícito | DateTime (o false) |
strtotime() | string que PHP intenta adivinar | timestamp Unix int (o false) |
date_parse_from_format() | string + formato explícito | array asociativo de componentes |
Usa date_create_from_format() cuando el diseño sea fijo y quieras un objeto DateTime completo para manipular. Usa strtotime() para cadenas informales de estilo humano como "next Friday", y date_parse_from_format() cuando solo necesites los números brutos de año/mes/día sin crear un objeto.
Conclusión
date_create_from_format() convierte una cadena en un diseño arbitrario y conocido en un objeto DateTime que puedes formatear, comparar y desplazar con el resto de la API de fechas de PHP. Recuerda usar el prefijo ! para valores de solo fecha, pasar un DateTimeZone cuando la zona horaria de origen importe, y protegerte siempre contra el retorno false.