strftime

(PHP 4, PHP 5, PHP 7, PHP 8)

strftimeFormatea una fecha/hora local con la configuración local

Advertencia

Esta función ha sido declarada OBSOLETA a partir de PHP 8.1.0. Su uso está totalmente desaconsejado.

Las alternativas a esta función son:

Descripción

#[\Deprecated]
strftime(string $format, ?int $timestamp = null): string|false

Formatea una fecha y/o una hora según la localización local. Los nombres de los meses, de los días de la semana pero también de otras cadenas dependientes de la localización, respetarán la localización actual definida por la función setlocale().

Advertencia

Todos los caracteres modificadores no siempre son soportados por todas las bibliotecas C. En este caso, no serán soportados por PHP tampoco. Además, todas las plataformas no soportan los timestamps negativos, y sus fechas podrían estar limitadas por el inicio de la época Unix. Esto significa que %e, %T, %R y %D (y puede que otros) y las fechas anteriores al 1 de Enero de 1970 no funcionarán bajo Windows, en algunas distribuciones de Linux, y en algunos sistemas operativos. Para Windows, una lista completa de las opciones de conversión está disponible en el » sitio de MSDN. Utilice en su lugar el método IntlDateFormatter::format().

Parámetros

format

Los siguientes caracteres son reconocidos en el argumento format
format Descripción Ejemplo de valores devueltos
Día --- ---
%a Nombre abreviado del día de la semana De Sun a Sat
%A Nombre completo del día de la semana De Sunday a Saturday
%d Día del mes en formato numérico, con 2 dígitos (con el cero inicial) De 01 a 31
%e Día del mes, con un espacio precediendo al primer dígito. La implementación de Windows es diferente, véase más abajo para más información. De 1 a 31
%j Día del año, con 3 dígitos con cero inicial 001 a 366
%u Representación ISO-8601 del día de la semana De 1 (para Lunes) a 7 (para Domingo)
%w Representación numérica del día de la semana De 0 (para Domingo) a 6 (para Sábado)
Semana --- ---
%U Número de la semana del año dado, comenzando por el primer Lunes como primera semana 13 (para la 13ª semana completa del año)
%V Número de la semana del año, siguiendo la norma ISO-8601:1988, comenzando como primera semana, la semana del año que contiene al menos 4 días, y donde Lunes es el inicio de la semana De 01 a 53 (donde 53 cuenta como semana de solapamiento)
%W Una representación numérica de la semana del año, comenzando por el primer Lunes de la primera semana 46 (para la 46ª semana de la semana comenzando por un Lunes)
Mes --- ---
%b Nombre del mes, abreviado, según la localización De Jan a Dec
%B Nombre completo del mes, según la localización De January a December
%h Nombre del mes abreviado, según la localización (alias de %b) De Jan a Dec
%m Mes, con 2 dígitos De 01 (para Enero) a 12 (para Diciembre)
Año --- ---
%C Representación, con 2 dígitos, del siglo (año dividido por 100, reducido a un entero) 19 para el siglo 20
%g Representación, con 2 dígitos, del año, compatible con los estándares ISO-8601:1988 (véase %V) Ejemplo: 09 para la semana del 6 de enero de 2009
%G La versión completa de 4 dígitos de %g Ejemplo: 2009 para la semana del 3 de enero de 2009
%y El año, con 2 dígitos Ejemplo: 09 para 2009, 79 para 1979
%Y El año, con 4 dígitos Ejemplo: 2038
Hora --- ---
%H La hora, con 2 dígitos, en formato 24 horas De 00 a 23
%k La hora en formato 24 horas, con un espacio precediendo a un solo dígito De 0 a 23
%I Hora, con 2 dígitos, en formato 12 horas De 01 a 12
%l ('L' minúscula) Hora, en formato 12 horas, con un espacio precediendo a un solo dígito De 1 a 12
%M Minuto, con 2 dígitos De 00 a 59
%p 'AM' o 'PM', en mayúsculas, basado en la hora proporcionada Ejemplo: AM para 00:31, PM para 22:23. El resultado exacto depende del sistema operativo, y pueden devolver también variantes en minúsculas, o variantes con puntos (como a.m.).
%P 'am' o 'pm', en minúsculas, basado en la hora proporcionada Ejemplo: am para 00:31, pm para 22:23. No soportado por todos los sistemas operativos.
%r Idéntico a "%I:%M:%S %p" Ejemplo: 09:34:17 PM para 21:34:17
%R Idéntico a "%H:%M" Ejemplo: 00:35 para 12:35 AM, 16:44 para 4:44 PM
%S Segundo, con 2 dígitos De 00 a 59
%T Idéntico a "%H:%M:%S" Ejemplo: 21:34:17 para 09:34:17 PM
%X Representación de la hora, basada en la localización, sin la fecha Ejemplo: 03:59:16 o 15:59:16
%z El desplazamiento horario. No implementado tal como se describe en Windows. Ver más abajo para más información. Ejemplo: -0500 para la hora del este de EE.UU.
%Z La abreviación del desplazamiento horario. No implementado tal como se describe en Windows. Ver más abajo para más información. Ejemplo: EST para la hora del este
Hora y fecha --- ---
%c Fecha y hora preferidas, basadas en la localización Ejemplo: Tue Feb 5 00:45:10 2009 para el 5 de febrero de 2009 a las 12:45:10 AM
%D Idéntico a "%m/%d/%y" Ejemplo: 02/05/09 para el 5 de febrero de 2009
%F Idéntico a "%Y-%m-%d" (usado habitualmente por las bases de datos) Ejemplo: 2009-02-05 para el 5 de febrero de 2009
%s Timestamp de la época Unix (idéntico a la función time()) Ejemplo: 305815200 para el 10 de septiembre de 1979 08:40:00 AM
%x Representación preferida de la fecha, basada en la localización, sin la hora Ejemplo: 02/05/09 para el 5 de febrero de 2009
Varios --- ---
%n Una nueva línea ("\n") ---
%t Una tabulación ("\t") ---
%% El carácter de porcentaje ("%") ---

Advertencia

A diferencia de la norma ISO-9899:1999, Sun Solaris comienza con el Domingo a 1. También, el formato %u no funcionará tal como se describe en este manual.

Advertencia

Solo Windows:

El modificador %e no es soportado bajo Windows. Para calcular el valor, el modificador %#d puede ser utilizado en su lugar. El ejemplo de abajo ilustra la manera de escribir un código multiplataforma.

Los modificadores %z y %Z devuelven ambos el nombre de la zona horaria en lugar del desplazamiento o de la abreviación.

Advertencia

Solo macOS y musl: El modificador %P no es soportado por la implementación de esta función bajo macOS.

timestamp

El parámetro opcional timestamp es una marca temporal de Unix de tipo integer que por defecto es la hora local si no se proporciona ningún valor a timestamp. En otras palabras, es de forma predeterminada el valor de la función time().

Valores devueltos

Devuelve una string formateada según el argumento format dado, utilizando el argumento timestamp o la fecha local actual si no se proporciona ningún timestamp. Los nombres de los meses, de los días de la semana pero también de otras cadenas dependientes de la localización, respetarán la localización actual definida por la función setlocale().

Errores/Excepciones

Cada vez que se llame a una función de fecha/hora se generará un E_NOTICE si la zona horaria no es válida, y/o un mensaje E_STRICT o E_WARNING si se emplea la configuración del sistema o la variable global TZ. Véase también date_default_timezone_set()

Dado que la salida depende de la biblioteca C subyacente, algunos especificadores de conversión no son soportados. Bajo Windows, el hecho de proporcionar un especificador de conversión desconocido devolverá 5 mensajes de nivel E_WARNING y devolverá false al final. Bajo otros sistemas operativos, no recibirá ningún mensaje de nivel E_WARNING y la salida contendrá los especificadores no convertidos.

Historial de cambios

Versión Descripción
8.0.0 timestamp ahora es nullable.

Ejemplos

Este ejemplo solo funcionará si tiene las localizaciones respectivas instaladas en su sistema.

Ejemplo #1 Ejemplo con strftime()

<?php
setlocale
(LC_TIME, "C");
echo
strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo
strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo
strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo
strftime(" in German %A.\n");
?>

Ejemplo #2 Ejemplo en formato de fecha ISO 8601:1988

<?php
/* Diciembre 2002 / Enero 2003
ISOWk L M X J V S D
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */

// Muestra: 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";

// Muestra: 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";

// Muestra: 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";

// Muestra: 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";

/* Diciembre 2004 / Enero 2005
ISOWk L M X J V S D
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */

// Muestra: 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";

// Muestra: 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";

// Muestra: 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";

// Muestra: 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";

?>

Ejemplo #3 %e funcionando en toda plataforma

<?php

// 1 de Enero: resultados en: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';

// Verifica bajo Windows, para encontrar y reemplazar el modificador %e
// correctamente
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}

echo
strftime($format);
?>

Ejemplo #4 Muestra todos los formatos conocidos o no

<?php

// Describe los formatos
$strftimeFormats = array(
'A' => 'Una representación textual completa del día',
'B' => 'Nombre del mes completo, basado en la localización',
'C' => 'Representación con 2 dígitos del año (año, dividido por 100, truncado a entero)',
'D' => 'Idéntico a "%m/%d/%y"',
'E' => '',
'F' => 'Idéntico a "%Y-%m-%d"',
'G' => 'La versión completa, con 4 dígitos de %g',
'H' => 'Una representación con 2 dígitos de la hora en formato 24-horas',
'I' => 'Una representación con 2 dígitos de la hora en formato 12-horas',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Una representación con 2 dígitos de los minutos',
'N' => '',
'O' => '',
'P' => '"am" o "pm" (en minúsculas) basado en la hora actual',
'Q' => '',
'R' => 'Idéntico a "%H:%M"',
'S' => 'Una representación con 2 dígitos de los segundos',
'T' => 'Idéntico a "%H:%M:%S"',
'U' => 'Número de la semana para el año actual, comenzando por el primer Domingo como primera semana',
'V' => 'Número ISO-8601:1988 de la semana del año actual, comenzando por la primera semana del año con al menos 4 días de semana, con el Lunes como inicio de semana',
'W' => 'Una representación numérica de la semana del año, comenzando por el primer Lunes como primera semana',
'X' => 'Representación preferida para la hora, basada en la localización, sin la fecha',
'Y' => 'Una representación con 4 dígitos del año',
'Z' => 'La abreviación del desplazamiento horario, no proporcionada por %z (depende del sistema operativo)',
'a' => 'La abreviación de la representación textual del día',
'b' => 'La abreviación del nombre del mes, basada en la localización',
'c' => 'Timestamp preferido basado en la localización',
'd' => 'Día del mes con 2 dígitos (con el cero inicial)',
'e' => 'Día del mes, con un espacio precediendo a un solo dígito',
'f' => '',
'g' => 'Una representación con 2 dígitos del año en formato ISO-8601:1988 (ver %V)',
'h' => 'Abreviación del nombre del mes, basada en la localización (alias de %b)',
'i' => '',
'j' => 'Día del año, con 3 dígitos con cero inicial',
'k' => 'Hora, en formato 24-horas, con un espacio precediendo a un solo dígito',
'l' => 'Hora, en formato 12-horas, con un espacio precediendo a un solo dígito',
'm' => 'Una representación del mes con 2 dígitos',
'n' => 'Un carácter de nueva línea ("\n")',
'o' => '',
'p' => '"AM" o "PM" (en mayúsculas) basado en la hora actual',
'q' => '',
'r' => 'Idéntico a "%I:%M:%S %p"',
's' => 'Timestamp respecto a la época Unix',
't' => 'Un carácter de tabulación ("\t")',
'u' => 'Representación numérica del día de la semana en formato ISO-8601',
'v' => '',
'w' => 'Representación numérica del día de la semana',
'x' => 'Representación preferida de la fecha, basada en la localización, sin la hora',
'y' => 'Representación del año con 2 dígitos',
'z' => 'O bien el desplazamiento horario desde UTC o su abreviación (según el sistema operativo)',
'%' => 'Un carácter porcentaje ("%")',
);

// Resultados
$strftimeValues = array();

// 2value los formatos mientras se eliminan los errores
foreach ($strftimeFormats as $format => $description) {
if (
false !== ($value = @strftime("%{$format}"))) {
$strftimeValues[$format] = $value;
}
}

// Encuentra el valor más largo
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));

// Muestra todos los formatos conocidos
foreach ($strftimeValues as $format => $value) {
echo
"Formato conocido: '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}

// Muestra todos los formatos no conocidos
foreach (array_diff_key($strftimeFormats, $strftimeValues) as $format => $description) {
echo
"Formato desconocido: '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}
?>

El resultado del ejemplo sería algo similar a:

Formato conocido: 'A' = 'Friday'            ( Una representación textual completa del día )
Formato conocido: 'B' = 'December'          ( Nombre del mes completo, basado en la localización )
Formato conocido: 'H' = '11'                ( Una representación con 2 dígitos de la hora en formato 24-horas )
Formato conocido: 'I' = '11'                ( Una representación con 2 dígitos de la hora en formato 12-horas )
Formato conocido: 'M' = '24'                ( Una representación con 2 dígitos de los minutos )
Formato conocido: 'S' = '44'                ( Una representación con 2 dígitos de los segundos )
Formato conocido: 'U' = '48'                ( Número de la semana para el año actual, comenzando por el primer Domingo como primera semana )
Formato conocido: 'W' = '48'                ( Una representación numérica de la semana del año, comenzando por el primer Lunes como primera semana )
Formato conocido: 'X' = '11:24:44'          ( Representación preferida para la hora, basada en la localización, sin la fecha )
Formato conocido: 'Y' = '2010'              ( Una representación con 4 dígitos del año )
Formato conocido: 'Z' = 'GMT Standard Time' ( La abreviación del desplazamiento horario, no proporcionada por %z (depende del sistema operativo) )
Formato conocido: 'a' = 'Fri'               ( La abreviación de la representación textual del día )
Formato conocido: 'b' = 'Dec'               ( La abreviación del nombre del mes, basada en la localización )
Formato conocido: 'c' = '12/03/10 11:24:44' ( Timestamp preferido basado en la localización )
Formato conocido: 'd' = '03'                ( Día del mes con 2 dígitos (con el cero inicial) )
Formato conocido: 'j' = '337'               ( Día del año, con 3 dígitos con cero inicial )
Formato conocido: 'm' = '12'                ( Una representación del mes con 2 dígitos )
Formato conocido: 'p' = 'AM'                ( "AM" o "PM" (en mayúsculas) basado en la hora actual )
Formato conocido: 'w' = '5'                 ( Representación numérica del día de la semana )
Formato conocido: 'x' = '12/03/10'          ( Representación preferida de la fecha, basada en la localización, sin la hora )
Formato conocido: 'y' = '10'                ( Representación del año con 2 dígitos )
Formato conocido: 'z' = 'GMT Standard Time' ( O bien el desplazamiento horario desde UTC o su abreviación (según el sistema operativo) )
Formato conocido: '%' = '%'                 ( Un carácter porcentaje ("%") )
Formato desconocido: 'C'                       ( Representación con 2 dígitos del año (año, dividido por 100, truncado a entero) )
Formato desconocido: 'D'                       ( Idéntico a "%m/%d/%y" )
Formato desconocido: 'E'
Formato desconocido: 'F'                       ( Idéntico a "%Y-%m-%d" )
Formato desconocido: 'G'                       ( La versión completa, con 4 dígitos de %g )
Formato desconocido: 'J'
Formato desconocido: 'K'
Formato desconocido: 'L'
Formato desconocido: 'N'
Formato desconocido: 'O'
Formato desconocido: 'P'                       ( "am" o "pm" (en minúsculas) basado en la hora actual )
Formato desconocido: 'Q'
Formato desconocido: 'R'                       ( Idéntico a "%H:%M" )
Formato desconocido: 'T'                       ( Idéntico a "%H:%M:%S" )
Formato desconocido: 'V'                       ( Número ISO-8601:1988 de la semana del año actual, comenzando por la primera semana del año con al menos 4 días de semana, con el Lunes como inicio de semana )
Formato desconocido: 'e'                       ( Día del mes, con un espacio precediendo a un solo dígito )
Formato desconocido: 'f'
Formato desconocido: 'g'                       ( Una representación con 2 dígitos del año en formato ISO-8601:1988 (ver %V) )
Formato desconocido: 'h'                       ( Abreviación del nombre del mes, basada en la localización (alias de %b) )
Formato desconocido: 'i'
Formato desconocido: 'k'                       ( Hora, en formato 24-horas, con un espacio precediendo a un solo dígito )
Formato desconocido: 'l'                       ( Hora, en formato 12-horas, con un espacio precediendo a un solo dígito )
Formato desconocido: 'n'                       ( Un carácter de nueva línea ("\n") )
Formato desconocido: 'o'
Formato desconocido: 'q'
Formato desconocido: 'r'                       ( Idéntico a "%I:%M:%S %p" )
Formato desconocido: 's'                       ( Timestamp respecto a la época Unix )
Formato desconocido: 't'                       ( Un carácter de tabulación ("\t") )
Formato desconocido: 'u'                       ( Representación numérica del día de la semana en formato ISO-8601 )
Formato desconocido: 'v'

Notas

Nota: %G y %V, que están basadas en la semana ISO 8601:1988, pueden conducir a resultados inesperados (aunque correctos) si el sistema de numeración no es conocido. Ver el ejemplo %V de esta página.

Ver también

add a note

User Contributed Notes 3 notes

up
3
divinity76+spam at gmail dot com
2 years ago
there is a strftime compatibility package for php>=8.1 at https://github.com/alphp/strftime
up
0
oriadam at example dot g dot com
1 month ago
Some formats can be replaced with the `date` function, for example:

strftime("%Y-%m-%d", $time);

can be replaced with

date("Y-m-d", $time);
up
0
kanif dot ahire at gmail dot com
5 months ago
Year is being displayed wrongly. It is displaying 2025 instead of 2024
E.g. strftime("%G-%B-%d %H:%M:%S", strtotime(date('2024-12-30 10:10:10')));
Output: 2025-December-30 10:10:10

Here G represents 4-digit year corresponding to the ISO week number. Based on this ISO week number year value will be displayed
Here B represents full month name
Here d represents day of the month (01 to 31)

Now because of this %G value we are getting the issue as ISO week number is calculated wrongly.
For example, If 30th December is falling on Monday, Tuesday, or Wednesday it is in W01 of the next year.
If it is on a Thursday, it is in W53 of the year just ending.
If on a Friday it is in W52 of the year just ending in common years and W53 in leap years.
If on a Saturday or Sunday, it is in W52 of the year just ending.
In this way week calculation happens and as 30th falls on Monday it is taking as W01 of the next year and it displays wrong year output.
For previous year no issue for this error because 30 and 31st Dec falls on sat or Sunday .

This same error occurs even if the Jan 1st falls on Friday. Then it will calculate it as W53 and displays the previous year value instead of current year.
To Top