Sometimes, you want Jan 1 to be week 1 and weeks to begin on Sunday. Here's a way to use strftime U format character to follow this convention:
<?php
$month = 5; $year = 2012; echo "Week #'s in May 2012: ";
$week_num_correction = strftime('%U', mktime(0,0,0,1,1,$year)) === '00' ? 1 : 0;
$week_numbers = range(strftime('%U', mktime(0,0,0,$month,1,$year)) + $week_num_correction, strftime('%U', mktime(0,0,0,$month+1,0,$year)) + $week_num_correction);
foreach($week_numbers as $week_number) echo "$week_number ";
?>
displays: Week #'s in May 2012: 18 19 20 21 22
strftime
(PHP 4, PHP 5)
strftime — Formatea una fecha/hora local según la configuración regional
Descripción
Formatea una fecha/hora local según la configuración regional. Los nombres del mes y del día de la semana y otras cadenas dependientes del lenguaje están subordinados a la configuración regional local establecida con setlocale().
No todos los especificadores de conversión están soportados por su biblioteca C, en cuyo caso no serán soportados por la fucnión strftime() de PHP. Adicionalmente, no todas las plataformas soportan marcas de tiempo negativas, por lo que el rango de fechas puede estar limitado a fechas que no sean anteriores a la época Unix. Eso significa que %e, %T, %R y, %D (y posiblemente otros) - así como las fechas anteriores al 1 Ene, 1970 - no funcionarán en Windows, en algunas distribucioes de Linux, y en otros pocos sistemas operativos. Para sistemas Windows se puede encontrar una visión general de los especificadores de conversión soportados en » MSDN.
Parámetros
- format
-
Los siguientes caracteres están reconocidos en el parámetro de cadena format format Descripción Ejemplo de valores devueltos Día --- --- %a Una representación textual abreviada del día Sun hasta Sat %A Una representación textual completa del día Sunday hsata Saturday %d El día del mes con dos dígitos (con ceros iniciales) 01 a 31 %e El día del mes, con un espacio precediendo a los dígitos simples. No está implementado como está descrito en Windows. Véase más abajo para más información. 1 a 31 %j Día del año, 3 dígitos con ceros iniciales 001 a 366 %u Representación numérica ISO-8601 del día de la semana 1 (para Lunes) hasta 7 (para Domingo) %w Representación numérica del día de la semana 0 (para Domingo) hasta 6 (para Sábado) Semana --- --- %U Número de semana del año dado, comenzando con el primer Domingo como la primera semana 13 (para la 13ª semana completa del año) %V Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana 01 hasta 53 (donde 53 cuenta para una semana solapada) %W Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana 46 (para la 46ª semana del año comenzando con un Lunes) Mes --- --- %b Nombre del mes abreviado, basado en la configuración regional Jan hasta Dec %B Nombre del mes completo, basado en la configuración regional January hasta December %h Nombre del mes abreviado, basado en la configuración regional (un alias de %b) Jan hasta Dec %m Representación de dos dígitos del mes 01 (para Enero) hasta 12 (para Diciembre) Año --- --- %C Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer) 19 para el Siglo XX %g Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V) Ejemplo: 09 para la semana del 6 de Enero de 2009 %G La versión de cuatro dígitos completa de %g Ejemplo: 2008 para la semana del 3 de Enero de 2009 %y Representación de dos dígitos del año Ejemplo: 09 para 2009, 79 para 1979 %Y Representación de cuatro dígitos del año Ejemplo: 2038 Hora --- --- %H Representación de dos dígitos de la hora en formato de 24 horas 00 hasta 23 %I Representación de dos dígitos de la hora en formato de 12 horas 01 hasta 12 %l ('L' minúscula) La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples 1 hasta 12 %M Representación de dos dígitos de los minutos 00 hasta 59 %p 'AM' o 'PM' en MAYÚSCULAS basados en la hora dada Ejemplo: AM para 00:31, PM para 22:23 %P 'am' o 'pm' en minúsculas basados en la hora dada Ejemplo: am para 00:31, pm para 22:23 %r Lo mismo que "%I:%M:%S %p" Ejemplo: 09:34:17 PM para 21:34:17 %R Lo mismo que "%H:%M" Ejemplo: 00:35 para 12:35 AM, 16:44 para 4:44 PM %S Representación de dos dígitos de los segundos 00 hasta 59 %T Lo mismo que "%H:%M:%S" Ejemplo: 21:34:17 para 09:34:17 PM %X Representación preferida de la hora basda en la configuración regional, sin la fecha Ejemplo: 03:59:16 o 15:59:16 %z El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo) Ejemplo: -0500 o EST para Hora del Este %Z La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo) Ejemplo: -0500 o EST para Hora del Este Marcas de Fecha y Hora --- --- %c Marca preferida de la fecha y hora basadas en la configuración regional Ejemplo: Tue Feb 5 00:45:10 2009 para el 5 de Febrero de 2009 a las 12:45:10 AM %D Lo mismo que "%m/%d/%y" Ejemplo: 02/05/09 para el 5 de Febrero de 2009 %F Lo mismo que "%Y-%m-%d" (normalmente usado en las marcas de fecha de bases de datos) Ejemplo: 2009-02-05 para el 5 de Febrero de 2009 %s Marca de tiempo del momento de la Época Unix (lo mismo que la función time()) Ejemplo: 305815200 para el 10 de Septiembre de 1979 08:40:00 AM %x Representación preferida de la fecha basda en la configuración local, sin la hora Ejemplo: 02/05/09 para el 5 de Febrero de 2009 Miscelánea --- --- %n Un carácter de nueva línea ("\n") --- %t Un carácter de tabulación ("\t") --- %% Un carácter literal de porcentaje ("%") --- La longitud máxima de este parámetro es de 1023 caracteres.
AdvertenciaA diferencia de ISO-9899:1999, Sun Solaris comienza con el Domingo como 1. Como resultado, %u puede no funcionar como está descrito en este manual.
AdvertenciaSolamente Windows: El modificador %e no está soportado en la implementación de Windows de esta función. Para obtener este valor se puede usar en su lugar el modificador %#d. El ejemplo de abajo ilustra cómo escribir una función compatible multiplataforma.
AdvertenciaSolamente Mac OS X: El modificador %P no está soportado en la implementación de Mac OS X de esta función.
- timestamp
-
El parámetro opcional timestamp es una marca de tiempo Unix de tipo integer que por defecto es la hora local si no se proporciona ningún valor a timestamp. En otras palabras, es por defecto el valor de la función time().
Valores devueltos
Devuelve una cadena formateada según format usando el parámetro timestamp dado o el momento actual local si no se da la marca de tiempo. Los nombres del mes y del día de la semana y otras cadenas dependientes del lenguaje están subordinados a la configuración regional local establecida con setlocale().
Errores/Excepciones
Cada vez que se llame a la función date/time se generará un E_NOTICE si la zona horaria no es válida, y/o un mensaje E_STRICT o E_WARNING si se usa la configuración del sistema o la variable global TZ. Vea también date_default_timezone_set()
Ya que la salida depende de la biblioteca C subyacente, algunos especificadores de conversión no están soportados. En Windows, proporcionar especificadores de conversión desconocidos resultará en 5 mensajes E_WARNING y devolverá FALSE. En otros sistemas operativos puede no obtenerse ningún mensaje E_WARNING y la salida contener los especificadores de conversión no convertidos.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 | Ahora muestra E_STRICT y E_NOTICE cuando ocurren errores con zonas horarias. |
Ejemplos
Este ejemplo funcionará si tiene instalada en su sistema la configuración regional respectiva.
Ejemplo #1 Ejemplos de configuraciones regionales con strftime()
<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" en Finlandés es %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" en Francés %A y");
setlocale(LC_TIME, "de_DE");
echo strftime(" en Alemán %A.\n");
?>
Ejemplo #2 Ejemplo de número de semana con ISO 8601:1988
<?php
/* Diciembre 2002 / Enero 2003
ISO 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 */
// Imprime: 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";
// Imprime: 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";
// Imprime: 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";
// Imprime: 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
ISO 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 */
// Imprime: 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";
// Imprime: 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";
// Imprime: 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";
// Imprime: 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 Ejemplo compatible de multi-plataforma usando del modificador %e
<?php
// Jan 1: resulta en: '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';
// Comprobación para Windows para hallar y remplazar el
// modificador %e adecuadamente
// el modificador %e si existen en el formato
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}
echo strftime($format);
?>
Ejemplo #4 Mostrar todos los formatos conocidos y desconocidos.
<?php
// Describe los formatos.
$strftimeFormats = array(
'A' => 'Una representación textual completa del día',
'B' => 'Nombre del mes completo, basado en la configuración regional',
'C' => 'Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer)',
'D' => 'Lo mismo que "%m/%d/%y"',
'E' => '',
'F' => 'Lo mismo que "%Y-%m-%d"',
'G' => 'La versión de cuatro dígitos completa de %g',
'H' => 'Representación de dos dígitos de la hora en formato de 24 horas',
'I' => 'Representación de dos dígitos de la hora en formato de 12 horas',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Representación de dos dígitos de los minutos',
'N' => '',
'O' => '',
'P' => ''am' o 'pm' en minúsculas basados en la hora dada',
'Q' => '',
'R' => 'Lo mismo que "%H:%M',
'S' => 'Representación de dos dígitos de los segundos',
'T' => 'Lo mismo que "%H:%M:%S"',
'U' => 'Número de semana del año dado, comenzando con el primer Domingo como la primera semana',
'V' => 'Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana',
'W' => 'Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana',
'X' => 'Representación preferida de la hora basda en la configuración regional, sin la fecha',
'Y' => 'Representación de cuatro dígitos del año',
'Z' => 'La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo)',
'a' => 'Una representación textual abreviada del día',
'b' => 'Nombre del mes abreviado, basado en la configuración regional',
'c' => 'Marca preferida de la fecha y hora basadas en la configuración regional',
'd' => 'El día del mes con dos dígitos (con ceros iniciales)',
'e' => 'El día del mes, con un espacio precediendo a los dígitos simples',
'f' => '',
'g' => 'Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V)',
'h' => 'Nombre del mes abreviado, basado en la configuración regional (un alias de %b)',
'i' => '',
'j' => 'Día del año, 3 dígitos con ceros iniciales',
'k' => '',
'l' => 'La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples',
'm' => 'Representación de dos dígitos del mes',
'n' => 'Un carácter de nueva línea ("\n")',
'o' => '',
'p' => ''AM' o 'PM' en MAYÚSCULAS basados en la hora dada',
'q' => '',
'r' => 'Lo mismo que "%I:%M:%S %p"',
's' => 'Marca de tiempo del momento de la Época Unix',
't' => 'Un carácter de tabulación ("\t")',
'u' => 'Representación numérica ISO-8601 del día de la semana',
'v' => '',
'w' => 'Representación numérica del día de la semana',
'x' => 'Representación preferida de la fecha basda en la configuración local, sin la hora',
'y' => 'Representación de dos dígitos del año',
'z' => 'El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo)',
'%' => 'Un carácter de porcentaje literal ("%")',
);
// Resultados.
$strftimeValues = array();
// Evalúa los formatos, mientras suprime cualquier error.
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));
// Reporta los formatos conocidos.
foreach($strftimeValues as $format => $value){
echo "Formato conocido : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}
// Reporta los formatos desconocidos.
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 configuración regional )
Formato conocido : 'H' = '11' ( Representación de dos dígitos de la hora en formato de 24 horas )
Formato conocido : 'I' = '11' ( Representación de dos dígitos de la hora en formato de 12 horas )
Formato conocido : 'M' = '24' ( Representación de dos dígitos de los minutos )
Formato conocido : 'S' = '44' ( Representación de dos dígitos de los segundos )
Formato conocido : 'U' = '48' ( Número de semana del año dado, comenzando con el primer Domingo como la primera semana )
Formato conocido : 'W' = '48' ( Una representación numérica de la semana del año, comenzando con el primer Domingo como la primera semana )
Formato conocido : 'X' = '11:24:44' ( Representación preferida de la hora basda en la configuración regional, sin la fecha )
Formato conocido : 'Y' = '2010' ( Representación de cuatro dígitos del año )
Formato conocido : 'Z' = 'GMT Standard Time' ( La opción de índice/abreviatura de la zona horaria NO dada por %z (depende del sistema operativo) )
Formato conocido : 'a' = 'Fri' ( Una representación textual abreviada del día )
Formato conocido : 'b' = 'Dec' ( Nombre del mes abreviado, basado en la configuración regional )
Formato conocido : 'c' = '12/03/10 11:24:44' ( Marca preferida de la fecha y hora basadas en la configuración regional )
Formato conocido : 'd' = '03' ( El día del mes con dos dígitos (con ceros iniciales) )
Formato conocido : 'j' = '337' ( Día del año, 3 dígitos con ceros iniciales )
Formato conocido : 'm' = '12' ( Representación de dos dígitos del mes )
Formato conocido : 'p' = 'AM' ( 'AM' o 'PM' en MAYÚSCULAS basados en la hora dada )
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 basda en la configuración local, sin la hora )
Formato conocido : 'y' = '10' ( Representación de dos dígitos del año )
Formato conocido : 'z' = 'GMT Standard Time' ( El índice de la zona horaria de UTC o la abreviatura (depende del sistema operativo) )
Formato conocido : '%' = '%' ( Un carácter de porcentaje literal ("%") )
Formato desconocido : 'C' ( Representación de dos dígitos del siglo (año dividido entre 100, truncado a un integer) )
Formato desconocido : 'D' ( Lo mismo que "%m/%d/%y" )
Formato desconocido : 'E'
Formato desconocido : 'F' ( Lo mismo que "%Y-%m-%d" )
Formato desconocido : 'G' ( La versión de cuatro dígitos completa 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 basados en la hora dada )
Formato desconocido : 'Q'
Formato desconocido : 'R' ( Lo mismo que "%H:%M )
Formato desconocido : 'T' ( Lo mismo que "%H:%M:%S" )
Formato desconocido : 'V' ( Número de semana ISO-8601:1988 del año dado, comenzando con la primera semana del año con al menos 4 días de semana, con Lunes siendo el principio de la semana )
Formato desconocido : 'e' ( El día del mes, con un espacio precediendo a los dígitos simples )
Formato desconocido : 'f'
Formato desconocido : 'g' ( Representación de dos dígitos del año por el estándar ISO-8601:1988 (véase %V) )
Formato desconocido : 'h' ( Nombre del mes abreviado, basado en la configuración regional (un alias de %b) )
Formato desconocido : 'i'
Formato desconocido : 'k'
Formato desconocido : 'l' ( La hora en formato de 12 horas, con un espacio precediendo a los dígitos simples )
Formato desconocido : 'n' ( Un carácter de nueva línea ("\n") )
Formato desconocido : 'o'
Formato desconocido : 'q'
Formato desconocido : 'r' ( Lo mismo que "%I:%M:%S %p" )
Formato desconocido : 's' ( Marca de tiempo del momento de la Época Unix )
Formato desconocido : 't' ( Un carácter de tabulación ("\t") )
Formato desconocido : 'u' ( Representación numérica ISO-8601 del día de la semana )
Formato desconocido : 'v'
Notas
Nota: %G y %V, que están basados en el número de semana ISO 8601:1988, pueden dar resultados inesperados (aunque correctos) si el sistema numérico no se entendió perfectamente. Véase los ejemplos de %V en esta página del manual.
Ver también
- » Herramienta online para diseñar el formato de strftime()
- setlocale() - Establecer la información de la configuración regional
- mktime() - Obtener la marca de tiempo Unix de una fecha
- strptime() - Analiza una fecha/hora generada con strftime
- gmstrftime() - Formatear una fecha/hora GMT/UTC según la configuración regional
- » Especificación de strftime() del Open Group
The example of the workarround for the %e modifier is a bit complex. Sometime you might want to prefer a simple ltrim():
<?php
ltrim(strftime('%d', $time), '0');
?>
If moving from date() to strftime() to support additional languages, you may miss the ordinal suffix format option date('S'). Workaround this by adding an extra modifier (%O).
<?php
function my_strftime ($format, $timestamp)
{
$format = str_replace('%O', date('S', $timestamp), $format);
return strftime($format, $timestamp);
}
?>
If strange characters are returned use utf8_encode(strftime()) for UTF-8 characters
This worked for me to distinguish between windows and linux, for stripping leading zeros from days/months in the short formats (like for Czech):
stristr(PHP_OS,"win") ? "%#d.%#m.%Y" : "%-d.%-m.%Y"
%V may fail with some systems (Windows XP, at least). Here is a function that should work to get the week number of a day (timestamped), according to ISO 8601.
"should work" as in "it is working with my understanding of this norm", where 1st of january can be week 52, 53 or 01. Hopefully.
testing (php_uname("s") == "Windows NT") or equivalent can be an option (when switching between Wampserver and a GNU server, for instance).
Please, erase and correct my message if there is any error.
<?php
function week_isonumber ($time) {
// When strftime("%V") fails, some unoptimized workaround
//
// http://en.wikipedia.org/wiki/ISO_8601 : week 1 is "the week with the year's first Thursday in it (the formal ISO definition)"
$year = strftime("%Y", $time);
$first_day = strftime("%w", mktime(0, 0, 0, 1, 1, $year));
$last_day = strftime("%w", mktime(0, 0, 0, 12, 31, $year));
$number = $isonumber = strftime("%W", $time);
// According to strftime("%W"), 1st of january is in week 1 if and only if it is a monday
if ($first_day == 1)
$isonumber--;
// 1st of january is between monday and thursday; starting (now) at 0 when it should be 1
if ($first_day >= 1 && $first_day <= 4)
$isonumber++;
else if ($number == 0)
$isonumber = week_isonumber(mktime(0, 0, 0, 12, 31, $year - 1));
if ($isonumber == 53 && ($last_day == 1 || $last_day == 2 || $last_day == 3))
$isonumber = 1;
return sprintf("%02d", $isonumber);
}
?>
Why not use utf8_encode to fix problems with letters in ISO-8859-1 and charset set to UTF-8?
For example:
<?php
setlocale(LC_TIME, "de_DE");
echo utf8_encode(strftime('%B')); // Output e.g.: März
?>
The format "%e" does not work on Windows.
There is a bug entry : http://bugs.php.net/bug.php?id=45847
It's because strftime is not portable, it use the operating system function.
For Win32, to get more documentation we have to consult the Windows "Run-Time Library Reference" for strftime :
http://msdn.microsoft.com/en-us/library/fe06s4ak%28VS.71%29.aspx
And we can find the solution:
replace "%e" by "%#d"
the "#" remove leading zeros (if any).
Cyrille
Created this small method to convert a date format to a strftime format. One format is enough to learn :)
<?php
/**
* Convert a date format to a strftime format
*
* Timezone conversion is done for unix. Windows users must exchange %z and %Z.
*
* Unsupported date formats : S, n, t, L, B, G, u, e, I, P, Z, c, r
* Unsupported strftime formats : %U, %W, %C, %g, %r, %R, %T, %X, %c, %D, %F, %x
*
* @param string $dateFormat a date format
* @return string
*/
public static function dateFormatToStrftime($dateFormat) {
$caracs = array(
// Day - no strf eq : S
'd' => '%d', 'D' => '%a', 'j' => '%e', 'l' => '%A', 'N' => '%u', 'w' => '%w', 'z' => '%j',
// Week - no date eq : %U, %W
'W' => '%V',
// Month - no strf eq : n, t
'F' => '%B', 'm' => '%m', 'M' => '%b',
// Year - no strf eq : L; no date eq : %C, %g
'o' => '%G', 'Y' => '%Y', 'y' => '%y',
// Time - no strf eq : B, G, u; no date eq : %r, %R, %T, %X
'a' => '%P', 'A' => '%p', 'g' => '%l', 'h' => '%I', 'H' => '%H', 'i' => '%M', 's' => '%S',
// Timezone - no strf eq : e, I, P, Z
'O' => '%z', 'T' => '%Z',
// Full Date / Time - no strf eq : c, r; no date eq : %c, %D, %F, %x
'U' => '%s'
);
return strtr((string)$dateFormat, $caracs);
}
?>
I use it with this condition on a date format :
if(preg_match("/(D|l|F|M)/", $format))
You can remove leading "0" from %m (two digit representation of the month) by using "-".
%-m => Month of the year (1 to 12) without leading zero
On the Linux server I'm using, strftime() also accepts a "-" option to request no padding:
<?php
$ts = strtotime("4 Nov 2009");
echo strlen(strftime("%-e", $ts)), "\n"; // "1" (no padding)
echo strlen(strftime("%e", $ts)), "\n"; // "2" (space padded)
?>
This is that worked with UTF-8 encoding on Linux server, with right accents:
<?php
setlocale(LC_ALL, 'hu_HU.UTF8');
echo(strftime('%Y. %B %d. %A'));
?>
Output is:
2009. november 02. hétfő
Also, this one can be used, if not utf-8 preferred:
<?php
setlocale(LC_ALL, 'hu_HU.ISO8859-2');
?>
UTF-8 is not supported on windows platforms, so there the iconv workaround must be used:
<?php
setlocale(LC_ALL, 'hun_hun');
echo(iconv('ISO-8859-2', 'UTF-8',strftime('%Y. %B %d. %A')));
?>
The output is the same as before. Note that, the iconv first parameter is ISO-8859-2 not ISO-8859-1, because the locale is hungarian which uses 8859-2 codepage as default. It is needed for the right accents.
If you want use the same code for Windows and Linux platforms, the second one is the right option (the iconv trick), but the locale configuration must be different (Linux: hu_HU, windows: hun_hun), but in that case the UTF8 tag is not needed for the Linux config.
<?php
// Date string
$timestamp = strftime("%Y-%m-%d %H:%M:%S %Y");
// From this string ($timestamp) can we print
echo strftime("%a %d %b %H:%M:%S %Y", strtotime($timestamp))."<br/>";
echo strftime("%a %d %b %H:%M", strtotime($timestamp))."<br/>";
echo strftime("%Y-%m-%d %H:%M:%S", strtotime($timestamp))."<br/>";
echo strftime("%Y-%m-%d %H:%M", strtotime($timestamp))."<br/>";
echo strftime("%Y-%m-%d", strtotime($timestamp))."<br/>";
echo strftime("%a %d %b %Y", strtotime($timestamp))."<br/>";
/*And it will output
Wed 20 May 15:53:40 2009
Wed 20 May 15:53
2009-05-20 15:53:40
2009-05-20 15:53
2009-05-20
Wed 20 May 2009
*/
?>
This is so simple it has to be found in one of all the comments on all those different time functions. But since I didn't find it, here it is: Use this to convert between different time formats:
<?PHP
if (!function_exists('convertTime')) {
/** Converts time strings from one format into another using
* PHP formats.
*
* @param String $dformat Format to convert to
* @param String $sformat Format to convert from, e.g. format
* of $ts
* @param String $ts Time string to be converted
* @return String Supplied time translated to the format specified
* in $dformat
*/
function convertTime($dformat,$sformat,$ts) {
extract(strptime($ts,$sformat));
return strftime($dformat,mktime(
intval($tm_hour),
intval($tm_min),
intval($tm_sec),
intval($tm_mon)+1,
intval($tm_mday),
intval($tm_year)+1900
));
}
}
/*
* And for the test....
*/
echo convertTime('%Y-%m-%d','%d.%m.%Y','27.11.2009');
?>
This should print "2009-27-11".
I did not put much effort in this code. The task also seems "too simple to be neccessary". But as I said, I didn't find anything to help me with this.
Cheers,
Michael Z
I had a need to subtrackt an older time from current time to get the time between.
Example: If one has worked from 2009-03-16 11:33:54 to 2009-03-16 12:01:54 then he has worked X hours,minutes and seconds. I tried to find that X. And so - one solution would be:
<?php
$start_date = strtotime("2009-03-16 11:33:54"); //start date from database - date("Y-m-d H:i:s") made as UNIX timestamp
$end_date = strtotime("2009-03-16 12:01:54"); //end date from database - date("Y-m-d H:i:s") made as UNIX timestamp
$ajavahe = $end_date - $start_date;
$time_between = gmstrftime('%Hh %Mm %Ss', $ajavahe); //gmstrftime() deals with different timezones correctly. (If in example you would be situated in Estonia and you would use strftime() you get wrong answer off by 2 hrs, because timezone is GMT+2 - with gmstrftime() comes right answer.)
echo 'You have worked: '.$time_between;
?>
Hope that this one makes someones life easier :D
<?php
/*
* This function figures out what fiscal year a specified date is in.
* $inputDate - the date you wish to find the fiscal year for. (12/4/08)
* $fyStartDate - the month and day your fiscal year starts. (7/1)
* $fyEndDate - the month and day your fiscal year ends. (6/30)
* $fy - returns the correct fiscal year
*/
function calculateFiscalYearForDate($inputDate, $fyStart, $fyEnd){
$date = strtotime($inputDate);
$inputyear = strftime('%Y',$date);
$fystartdate = strtotime($fyStart.$inputyear);
$fyenddate = strtotime($fyEnd.$inputyear);
if($date < $fyenddate){
$fy = intval($inputyear);
}else{
$fy = intval(intval($inputyear) + 1);
}
return $fy;
}
// my fiscal year starts on July,1 and ends on June 30, so...
echo calculateFiscalYearForDate("5/15/08","7/1","6/30");
// returns 2008
echo calculateFiscalYearForDate("12/1/08","7/1","6/30");
// returns 2009
?>
for Arabic
<?php
setlocale(LC_ALL,'ar');
echo strftime('%A %d %B %Y');
?>
This is what worked in my case:
<?php
setlocale(LC_ALL, 'es_ES').': ';
echo iconv('ISO-8859-1', 'UTF-8', strftime('%A %d de %B de %Y', time()));
?>
it displays: miércoles 22 de octubre de 2008
For windows user:
If you unsuccessfully change date/time format to your locale country using xx_XX format, try using XXX format or ISO-639 country codes format.
See complete list for ISO-639 here: http://www.w3.org/WAI/ER/IG/ert/iso639.htm
For example:
<?php
setlocale(LC_ALL, 'IND');
echo strftime("Today in Indonesia is %A");
?>
Here's a simple version for date formating i use between displaying in HTML and converting back to MYSQL format:
<?php
function format_date($original='', $format="%m/%d/%Y") {
$format = ($format=='date' ? "%m-%d-%Y" : $format);
$format = ($format=='datetime' ? "%m-%d-%Y %H:%M:%S" : $format);
$format = ($format=='mysql-date' ? "%Y-%m-%d" : $format);
$format = ($format=='mysql-datetime' ? "%Y-%m-%d %H:%M:%S" : $format);
return (!empty($original) ? strftime($format, strtotime($original)) : "" );
}
?>
example (in HTML or webapp):
[grab from database]...
$dbase_stored_date = "2007-03-15";
$display_html_date = format_date($dbase_stored_date);
... displays as "03/15/2007"
example (saving form via on POST/GET):
$update_date = format_date($_POST['display_html_date'], 'mysql-date');
// converts back to '2007-03-15'
.... [your mysql update here]
Don't forget to sanitize your POST/GET's =)
Here is a function to convert dates before 1970, very useful if you are still using php 4 (it is supported in php5) :
<?php
# convert a date to special format
# $date is like 2000-01-01 00:00:00
# $format : refer to strftime function
function convert_date($date,$format) {
if($date=='0000-00-00 00:00:00' OR $date=='0000-00-00' OR $date=='' OR $date==NULL) {
return '';
}
else {
$year=substr($date,0,4);
if(phpversion() < 5.0 AND $year < 1970) {
$new_date=substr_replace($date,'1980',0,4); # we replace the year by a year after 1970
$new_format=eregi_replace('%a|%A|%u','',$format); # we remove days information from the format because they would be wrong
$new_date=strftime($new_format,strtotime($new_date)); # we convert the date
$new_date=eregi_replace('1980',$year,$new_date); # we put back the real year
return $new_date;
}
else {
return strftime($format,strtotime($date));
}
}
}
?>
A small function to get the first weekday of the month.
For example the first monday of the month, or the first friday, etc.
<?php
/**
*
* Gets the first weekday of that month and year
*
* @param int The day of the week (0 = sunday, 1 = monday ... , 6 = saturday)
* @param int The month (if false use the current month)
* @param int The year (if false use the current year)
*
* @return int The timestamp of the first day of that month
*
**/
function get_first_day($day_number=1, $month=false, $year=false)
{
$month = ($month === false) ? strftime("%m"): $month;
$year = ($year === false) ? strftime("%Y"): $year;
$first_day = 1 + ((7+$day_number - strftime("%w", mktime(0,0,0,$month, 1, $year)))%7);
return mktime(0,0,0,$month, $first_day, $year);
}
// this will output the first wednesday of january 2007 (wed 03-01-2007)
echo strftime("%a %d-%m-%Y", get_first_day(3, 1, 2007));
?>
note, that for some languages you MUST set LC_ALL instead of LC_TIME.
note that you further have to explicitly define your output-encoding (default is ISO-8859-1 [which makes problems for some languages])!
at least i expirienced this behaviour on a german WinXP-PHP4 environment:
<?php
// does not work - gives question marks:
setlocale(LC_TIME, 'RUS'); // ISO Alpha-3 is supported by xp
echo strftime('%A', time());
?>
<?php
// DOES work:
header('Content-Type: text/html; charset=UTF-8'); // you could also use another charset here if iconv isn't installed on your system.
echo setlocale(LC_ALL, 'RUS').': ';
echo iconv('windows-1251', 'UTF-8', strftime('%A', time()))."\n";
?>
This little function allows you to provide a reasonably human readable string and convert to a timestamp - see example in comments below.
I find it far more useful than having to remember all the '%' modifiers. Am also well aware of its failings but it works in a lot of the real life situations I've come across.
<?php
function AmazingStringFromTime($str, $nTimestamp = null)
{
// This function reads a human readable string representation of dates. e.g.
// DD MM YYYY => 01 07 1978
// DDD D MMM YY => Mon 1 Jul 78
$arrPairs = array(
"DDDD" => "%A",
"DDD" => "%a",
"DD" => "%d",
"D" => "%e", // has leading space: ' 1', ' 2', etc for single digit days
"MMMM" => "%B",
"MMM" => "%b",
"MM" => "%m",
"YYYY" => "%Y",
"YY" => "%y",
"HH" => "%H",
"hh" => "%I",
"mm" => "%M",
"ss" => "%S",
);
$str = str_replace(array_keys($arrPairs), array_values($arrPairs), $str);
return strftime($str, $nTimestamp);
}
?>
Function strftime() use the locales installed in your system (linux).
If you are like me and only leave in the system the locales you use normally (en_US and your own language locale, like es_ES), you'll only be able to use the locales installed. If your application is translated to other languages, you need these locales too.
The name of the locale in your system is important too. This can be a problem when you want to distribute the app.
If you have this locales in your system:
en_US/ISO-8859-1
en_US.UTF-8/UTF-8
es_ES/ISO-8859-1
es_ES@euro/ISO-8859-15
es_ES.UTF-8/UTF-8
es_ES@euro/UTF-8
and use setlocale('es_ES'), the result will use the iso-8859-1 charset even if you have all your system, files and configuration options in UTF-8. To receive content in UTF-8, in this example, you need to use setlocale('es_ES.UTF-8') or setlocale('es_ES.UTF-8@UTF-8').
The definition of locales can change from one system to another, and so the charset from the results.
(in addition to Andy's post)
To get a RFC 2822 date (used in RSS) of the current local time :
echo strftime ("%a, %d %b %Y %H:%M:%S %z") ;
Note: option %z / %Z - work different on Windows platform, for example
output of this code line can be:
Thu, 02 Nov 2006 09:54:59 Jerusalem Standard Time (on Windows)
Thu, 02 Nov 2006 09:54:59 +0200 (on Linux)
[red. It is much smarter to use date(DATE_RSS); here]
Under windows if you are using Japanese version, you must use the following code:
setlocale(LC_ALL, "Japanese_Japan.20932") for EUC
setlocale(LC_ALL, "Japanese_Japan.932") for SJIS
I found the following page that helped me with this issue:
http://moodle.org/mod/forum/discuss.php?d=8329
The following function implements the conversion specifiers which are not supported on Win32 platforms:
(Note: the specifiers %V, %G and %g can be implemented using other functions described in this section)
<?php
function strftime_win32($format, $ts = null) {
if (!$ts) $ts = time();
$mapping = array(
'%C' => sprintf("%02d", date("Y", $ts) / 100),
'%D' => '%m/%d/%y',
'%e' => sprintf("%' 2d", date("j", $ts)),
'%h' => '%b',
'%n' => "\n",
'%r' => date("h:i:s", $ts) . " %p",
'%R' => date("H:i", $ts),
'%t' => "\t",
'%T' => '%H:%M:%S',
'%u' => ($w = date("w", $ts)) ? $w : 7
);
$format = str_replace(
array_keys($mapping),
array_values($mapping),
$format
);
return strftime($format, $ts);
}
?>
To get a RFC 850 date (used in HTTP) of the current time:
gmstrftime ("%A %d-%b-%y %T %Z", time ());
This will get for example:
Friday 25-Jun-04 03:30:23 GMT
Please note that times in HTTP-headers _must_ be GMT, so use gmstrftime() instead of strftime().
Note that setting LC_TIME is not enough for some locales under Windows, e.g. Czech, because there are some characters not contained in default (US) character set like '�' (c with hook), '�' (r with hook).
If you run Apache as regular application and have set your locale to Czech (ControlPanel/RegionalOptions), there is no problem and 'September' is correctly translated as 'z���', 'Thursday' as '�tvrtek'.
But if you run Apache as service, you get 'z�r�', and 'ctvrtek'.
To get things work as you expect you must set LC_CTYPE beside LC_TIME, or set LC_ALL.
<?php
$locale = 'Czech_Czech.1250';
$res = setlocale( 'LC_CTYPE', $locale); //important
$res = setlocale( 'LC_TIME', $locale);
echo strftime( '%A %m. %B %Y', mktime( 0,0,0,9,6,2001));
?>
Locale names are OS dependent. HP-UX 11.0, for example, has three
German locales, de_DE.roman8, de_DE.iso88591, and
de_DE.iso885915@euro.
The command locale -a will display all available locales on a system.
So on HP-UX, to get German dates:
<?php
setlocale("LC_TIME", "de_DE.roman8");
print(strftime("%A\n"));
?>
