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");
?>
strftime
(PHP 4, PHP 5)
strftime — Dar formato a una hora/fecha local de acuerdo a valores de localidad
Descripción
Devuelve una cadena con formato de acuerdo a la cadena de formato dada usando la marca_de_tiempo dada o la hora local si no se entrega una marca de tiempo. Los nombres de mes y día de la semana y otras cadenas dependientes del idioma respetan la localidad actual definida con setlocale().
Puede que no todos los especificadores de conversión sean soportados por su biblioteca C, en cuyo caso no serán soportados por la función de PHP strftime(). Adicionalmente, no todas las plataformas soportan marcas de tiempo negativas, por lo tanto su rango de fecha puede estar limitado a no antes del valor epoch de Unix. Esto quiere decir que p.ej. %e, %T, %R y %D (pueden haber más) y las fechas anteriores a Jan 1, 1970 no funcionarán en Windows, algunas distribuciones Linux, y algunos otros sistemas operativos. Para sistemas Windows, puede encontrarse una completa reseña de los especificadores de conversión soportados en este » sitio web de MSDN.
Lista de parámetros
- formato
-
Los siguientes especificadores de conversión son reconocidos en la cadena de formato:
- %a - nombre abreviado del día de la semana de acuerdo a la localidad actual
- %A - nombre completo del día de la semana de acuerdo a la localidad actual
- %b - nombre abreviado del mes de acuerdo a la localidad actual
- %B - nombre completo del mes de acuerdo a la localidad actual
- %c - representación de fecha y hora preferida para la localidad actual
- %C - número de la centuria (el año es dividido en 100 y truncado a un entero, en el rango 00 a 99)
- %d - día del mes como un número decimal (rango 01 a 31)
- %D - igual que %m/%d/%y
- %e - día del mes como un número decimal, un dígito sencillo es precedido por un espacio (rango ' 1' a '31')
- %g - como %G, pero sin la centuria.
- %G - El año de 4-dígitos correspondiente al número de semana ISO (vea %V). Éste tiene el mismo formato y valor que %Y, con la excepción de que si el número de semana ISO pertenece al año siguiente o previo, ese año es usado en su lugar.
- %h - igual que %b
- %H - hora como un número decimal usando un reloj de 24 horas (rango 00 a 23)
- %I - hora como número decimal usando un reloj de 12 horas (rango 01 a 12)
- %j - dúa del año como un número decimal (rango 001 a 366)
- %m - mes como un número decimal (rango 01 a 12)
- %M - minuto como un número decimal
- %n - caracter de nueva línea
- %p - o bien `am' o `pm' de acuerdo al valor de hora dada, o las cadenas correspondientes para la localidad actual
- %r - hora en notación a.m. y p.m.
- %R - hora en notación de 24 horas
- %S - segundo como un número decimal
- %t - caracter de tabulación
- %T - hora actual, equivalente a %H:%M:%S
-
%u - día de la semana como un número decimal [1,7], en donde
1 representa Lunes
Warning
Solaris Sun parece iniciar con Domingo como 1, aunque ISO 9889:1999 (el estándar C actual) claramente especifica que debe ser Lunes.
- %U - número de la semana del año actual como un número decimal, comenzando con el primer Domingo como el primer día de la primera semana
- %V - el número de semana ISO 8601:1988 del año actual como un número decimal, rango 01 a 53, en donde la semana 1 es la primera semana que tiene por lo menos 4 días en el año actual, y en donde el Lunes es el primer día de la semana. (Use %G o %g para el componente de año que corresponde al número de semana para la marca de tiempo especificada.)
- %W - número de semana del año actual como un número decimal, comenzando con el primer Lunes como el primer día de la primera semana
- %w - día de la semana como un decimal, Domingo es 0
- %x - representación de fecha preferida para la localidad actual sin la hora
- %X - representación de hora preferida para la localidad actual sin la fecha
- %y - año como un número decimal sin la centuria (rango 00 a 99)
- %Y - año como un número decimal incluyendo la centuria
- %Z o %z - zona horaria o nombre o abreviación
- %% - un caracter `%' literal
- timestamp
-
The optional timestamp parameter is an integer Unix timestamp that defaults to the current local time if a timestamp is not given. In other words, it defaults to the value of time().
Errors/Exceptions
Every call to a date/time function will generate a E_NOTICE if the time zone is not valid, and/or a E_STRICT message if using the system settings or the TZ environment variable. See also date_default_timezone_set()
Registro de cambios
| Versión | Descripción |
|---|---|
| 5.1.0 | Now issues the E_STRICT and E_NOTICE time zone errors. |
Ejemplos
Este ejemplo funciona si se tienen las localidades respectivas instaladas en el sistema.
Example #1 Ejemplo de strftime() con localidad
<?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");
?>
Example #2 Ejemplo del número de semana ISO 8601:1988
<?php
/* Diciembre 2002 / Enero 2003
SmISO L M Mi 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
SmISO L M Mi 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";
?>
Notes
Note: %G y %V, que están basados en números de semana ISO 8601:1988 pueden dar resultados inesperados (aunque correctos) si el sistema de numeración no es entendido completamente. Vea los ejemplos de %V en la presente página del manual.
strftime
21-Aug-2008 05:51
18-Aug-2008 01:26
Many of the conversion specifiers don't work with the Win32 implementation. Check this list to see which ones will work:
http://msdn.microsoft.com/en-us/library/fe06s4ak(VS.71).aspx
09-May-2008 10:45
You can get MS locale strings from here now:
http://msdn.microsoft.com/de-de/library/cdax410z.aspx
Search for "country codes" or "region codes", if they move it again!
(see below...)
09-Mar-2008 04:36
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 =)
25-Feb-2008 01:08
%u doesn't work under MS Windows. But getDate()['wday'] works as a perfekt workaround.
23-Feb-2008 08:01
If the second parameter is null, PHP treats it as 0, so strftime return something like 01/01/1970. Be aware of this.
07-Nov-2007 09:55
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));
}
}
}
?>
19-Sep-2007 04:39
If strlen($format) >= 1024, the output of strftime($format) is the empty string.
31-Aug-2007 03:43
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));
?>
28-Aug-2007 02:58
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";
?>
21-Jun-2007 02:03
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);
}
?>
20-Jan-2007 06:35
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.
02-Nov-2006 09:07
(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]
17-Aug-2006 05:45
In response to the note supplied by "Arpad Borsos":
I think the whole truth is that the output of strftime() considers whatever you stated with setlocale().
<?php
/* Berlin is in Germany */
$locale = setlocale (LC_ALL, 'de_DE.UTF-8');
/* Output: Donnerstag, 23. März 2006 (and hopefully UTF-8 ;) */
echo strftime ("%A, %d. %B %Y", strtotime('2006-03-23'));
/* try different possible locale names for german as of PHP 4.3.0 */
$locale = setlocale(LC_ALL, 'de_DE.UTF-8', 'de_DE.UTF-8@euro', 'de_DE');
echo "Preferred locale for german on this system is '$locale'";
?>
Check the documentation of setlocale() for more.
setlocale (LC_ALL, 'de_DE.UTF-8') always worked fine for me.
17-Aug-2006 01:32
Please note that the strftime output is not encoded in utf8 so you have to use utf8_encode() if you want to print localized month names e.g. for German "März"
[red. this depends on the platform though - some Windows locales *do* use UTF-8 for example]
27-Jul-2006 06:01
To mcallister, phloe and anyone else who want to get on the getDaySuffix() band wagon:
There are already functions to do this. All you really have to do is:
<?php echo date("jS", mktime(0,0,0,1,$myDay,2006)); ?>
Obviously, the only part of mktime that really matters is $myDay.
22-Jul-2006 07:54
In response to the note supplied by "segfault nycap rr com".
Here is a quicker and easier way:
Use the MySQL Time Function TIME_FORMAT() in your query:
mysql> SELECT TIME_FORMAT('14:35:00', '%l:%i %p');
Or try '%l' in PHP, it works on most systems and is part of the Open Group specification of strftime().
<?php
echo strftime('%l:%M %p', strtotime('14:35:00'));
?>
16-May-2006 05:47
When using strftime to generate time stamps for inclusion in RSS feeds, be sure to use %z for the timezone (RFC-822 format) rather than %Z -- for some reason, %Z fails to validate.
15-May-2006 08:37
To partialy correct Neo's on RFC 850 date...
RFC 850 is obsolete by RFC 1036.
In HTTP header, RFC 1123 is the first choice: it has a fixed length format and 4 digits year.
Therefore, the correct format is:
gmstrftime ("%a, %d %b %Y %T %Z", time ());
Output example: Sun, 06 Nov 1994 08:49:37 GMT
[red. Use date(DATE_RFC850, time()); instead. (Or DATE_RFC1123 or DATE_RFC1036)]
18-Jan-2006 02:49
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
20-Dec-2005 01:29
To correct an error in the above list of formatting codes:
%p - either `AM' or `PM' according to the given time value, or the corresponding strings for the current locale (note result is in capitals)
%P - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale (note result is in lower case)
In addition, the following codes seem to return a value on my system (Linux, Apache/1.3.33, PHP/4.4.1), but are not documented above. I have included the result given by passing them to gmstrftime() with a timestamp of 0 (unix epoch). gmstrftime() was used to avoid timezone/DST differences.
%F: "1970-01-01" (appears to be an SQL-formatted version of the date)
%k: "0" (seems to be the hour in 24-hour clock, without leading zeros (space-padded))
%l: "12" (seems to be the hour in 12-hour clock, without leading zeros (space-padded))
%s: "-3600"
%s seems to be the Unix timestamp passed to the function, but somehow based on the current locale/TZ settings (even in gmstrftime()).
On my system strftime("%H:%M:%S", 0) returns "01:00:00", and strftime("%s", 0) returns "0". Using gmstrftime() I get "00:00:00" and "-3600" respectively.
29-May-2005 03:32
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);
}
?>
20-Apr-2005 11:50
For freebsd user:
You can find the full list of your locale under /usr/share/locale.
For example da_DK.ISO8859-1 under this directory will set up the locale to danish.
19-Mar-2005 07:36
i had to use the czech representation of time on unix machine, running debian and linux version of apache with php 4
for me the best solution was to use this code:
<?php
setlocale(LC_ALL, 'cs_CZ.iso88592');
?>
then you can do everything in czech language with correct iso-8859-2 encoding ;D
25-Jan-2005 10:10
%k will give you %H (hour, 24-hour clock) with the leading zero replaced by a space. I have only tested this on one linux system so far, it may not work on windows or other linux builds.
06-Oct-2004 11:31
As said in these comments, Windows strftime() doesn't support %e. However, to achieve a similar effect (not 100%) you can use %#d. The # flag will remove the leading zero, so you do get single digits, but without the space that would be added by %e in other environments.
25-Jun-2004 08:27
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().
10-Jun-2004 01:48
For Spanish:
<?php
setlocale(LC_ALL, "sp");
echo strftime("%d. %B %Y");
?>
10-Sep-2001 03:02
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));
?>
22-Jul-2001 02:33
Beware of '%D':
the comment shown expects that this is the same as '%m/%d/%y'.
This is wrong: '%D' is only expected to returned an abbreviated numeric date according to the current locale:
In the German locale '%D' is '%y.%m.%d'
In the French locale '%D' is '%d/%m/%y'
The locale rules still apply to %D as with '%A'...
Beware that some C libraries do not support '%D' and/or '%A' or do not support them accordingly. Using strftime() is then system-dependant, because PHP use the C function provided by the system on which it runs.
18-Jul-2001 08:09
Solaris 2.6 and 7 define the
%u specifier differently than noted here. Day 1 is Sunday, not Monday. Solaris 8 gets it right.
Jim
23-Jul-1999 12:14
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:
setlocale("LC_TIME", "de_DE.roman8");
print(strftime("%A\n"));
