PHP: strftime - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

strptime mktime

Last updated: Sat, 27 Jan 2007

view this page in

# strftime

(PHP 3, PHP 4, PHP 5)

strftime -- Форматирует текущую дату/время с учетом текущей локали

## Описание

string strftime ( string format [, int timestamp] )

Возвращает строку, отформатированную в соответствии с аргументом `format`, используя аргумент `timestamp` или текущее системное время, если этот аргумент не передан. Названия месяцев, дней недели и другие строки, зависящие от языка, соответствуют текущей локали, установленной функцией setlocale().

В форматирующей строке распознаются следующие символы:

- %a - сокращенное название дня недели в текущей локали

- %A - полное название дня недели в текущей локали

- %b - сокращенное название месяца недели в текущей локали

- %B - полное название месяца недели в текущей локали

- %c - предпочтительный формат даты и времени в текущей локали

- %C - столетие (год, деленный на 100 и огругленный до целого, от 00 до 99)

- %d - день месяца в виде десятичного числа (от 01 до 31)

- %D - аналогично %m/%d/%y

- %e - день месяца в виде десятичного числа, если это одна цифра, то перед ней добавляется пробел (от ' 1' до '31')

- %g - подобно %G, но без столетия.

- %G - Год, 4-значное число, соответствующее номеру недели по ISO (см. %V). Аналогично %Y, за исключением того, что если номер недели по ISO соответствует предыдущему или следующему году, используется соответствующий год.

- %h - аналогично %b

- %H - номер часа от 00 до 23

- %I - номер часа от 01 до 12

- %j - номер дня в году (от 001 до 366)

- %m - номер месяца (от 01 до 12)

- %M - минуты

- %n - символ "\n"

- %p - `am' или `pm', или соответствующие строки в текущей локали

- %r - время в формате a.m. или p.m.

- %R - время в 24-часовом формате

- %S - секунды

- %t - символ табуляции ("\t")

- %T - текущее время, аналогично %H:%M:%S

- %u - номер дня недели от 1 до 7, где 1 соответствует понедельнику

  Внимание
  На Sun Solaris 1 соответствует воскресенью, хотя в ISO 9889:1999 (текущий стандарт языка C) явно указано, что это должен быть понедельник.

- %U - порядковый номер недели в текущем году. Первым днем первой недели в году считается первое воскресенье года.

- %V - Порядковый номер недели в году по стандарту ISO 8601:1988 от 01 до 53, где 1 соответствует первой неделе в году, в которой как минимум 4 дня принадлежат этому году. Первым днем недели считается понедельник. (Используйте %G or %g для определения соответствующего года)

- %W - порядковый номер недели в текущем году. Первым днем первой недели в году считается первый понедельник года.

- %w - номер дня недели, 0 соответствует воскресенью

- %x - предпочтительный формат даты без времени в текущей локали

- %X - предпочтительный формат времени без даты в текущей локали

- %y - год без столетия (от 00 до 99)

- %Y - год, включая столетие

- %Z - временная зона в виде смещения, аббривеатуры или полного наименования

- %% - символ `%'

> Замечание: strftime() использует функции операционной системы, поэтому отдельные форматирующие символы могут не работать в вашей операционной системе. Кроме того, не все платформы поддерживают отрицательные метки времени support negative timestamps. Это значит, что %e, %T, %R и %D (а возможно и другие) и даты до `Jan 1, 1970` не поддерживаются Windows, некоторыми версиями Linux и некоторыми другими операционными системами. Список форматирующих символов, поддерживаемых Windows, можно найти на сайте MSDN.

Пример 1. Пример использования функции strftime() с разными локалями

`<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" по-фински - %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" по-французски - %A и");
setlocale(LC_TIME, "de_DE");
echo strftime(" по-немецки - %A.\n");
?>`

Этот пример будет работать, если на вашей системе установлены соответствующие локали.

> Замечание: %G and %V, которые основаны на номере недели по ISO 8601:1988, Могут давать результат, отличный от ожидаемого, если вы не полностью понимаете систему нумерации, используемую этим стандартом. Смотрите описание %V выше и следующий пример.

Пример 2. Пример номеров недели по ISO 8601:1988

`<?php
/* Декабрь 2002 / Январь 2003
ISO Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
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 */
// Вывод: 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";
// Вывод: 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";
// Вывод: 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";
// Вывод: 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";
/* Декабрь 2004 / Январь 2005
ISO Пн Вт Ср Чт Пт Сб Вс
----- ----------------------------
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 */
// Вывод: 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";
// Вывод: 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";
// Вывод: 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";
// Вывод: 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";
?>`

См. также описание функций setlocale(), mktime(), и спецификацию strftime() Open Group.

add a note User Contributed Notes
strftime
judas dot iscariote at gmail dot com
21-Jan-2007 12:34
`Security notice:
You can end with a (probably unexpected) XSS if the $format parameter is user submitted data ;)
<?php
echo strftime("<script>alert('lol');</script>");
?>
PHP does not check if $format is a valid format, so the usual security precautions should be taken here .`
th1nk3r at gmail dot DELETETHIS dot com
20-Jan-2007 09: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.`
commander at graphicore dot de
18-Dec-2006 09:18
`Thats how I get the %G, %g ISO Year and %V Week with php 4.4.4 on Window$.
It works quite simple:
1. on January it can't be a week bigger than 51, thats what i've learned in school
2. on december many weeks have gone since the last New Year's Eve and therefore it cant be the first week of the year
i hope it saves time
<?php
function YearOfWeek($format,$date = NULL){
if(!isset($date)){
$date = time();
}
list ($G,$V,$month) = explode('_',date ('Y_W_m',$date));
if( ($month === '01') && ($V >= 52 ) ){
$G--;
}else if( ($month === '12') && ($V === '01') ){
$G++;
}
$g = substr($G, -2, 2);
$format = str_replace(array('%V','%G','%g'),array($V,$G,$g),$format);
return ($format);
}
$format = 'week %V of the year %G (%g), year %Y (%y)';
$date = mktime(0, 0, 0, 12, 31, 2008);
//week 01 of the year 2009 (09), year 2008 (08)
echo strftime(YearOfWeek($format,$date), $date) . "\n";
$date = mktime(0, 0, 0, 1, 1, 2010);
//week 53 of the year 2009 (09), year 2010 (10)
echo strftime(YearOfWeek($format,$date), $date) . "\n";
echo strftime(YearOfWeek($format)) . "\n";
//something like: week 51 of the year 2006 (06), year 2006 (06)
//depends on the day you do this
?>`
denis at spiralsolutions dot com
02-Nov-2006 12: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]`
NicSoft
06-Oct-2006 12:02
`Marian Sigler
Your point about javascript not being universal is correct. However, accept language header does not tell you the local time difference, which is the essential problem.
Also, as you point out, accept language is also not universal.
Most browsers do accept javascript. it is in common use by many websites. It is a safe bet if you are using drop down menus for instance that the script will work, otherwise they would not be able to use your site at all.`
Marian Sigler
18-Sep-2006 11:45
`@NicSoft: And what if the user's browser doesn't support JavaScript? You should either use the possibilities offered by PHP (most browsers send an Accept-Language header, from where you can extract the language to use) or at least offer the english name (e.g. inside <noscript>)`
NicSoft
21-Aug-2006 04:05
`A simple work around for displaying dates in local format is to get the browser to do it for you using javascript.
This routine accepts a date time field from sql,
and gets the timezone offset for your server, and passes these over to the browser in the form of a javascript script.
Javascript calculates the time difference and uses toLocaleString to display it.
function DisplaySQLDateInLocalTime($SQLDate){
list($year,$mon,$day,$hour,$min,$sec)=split('[-: ]',$SQLDate);
$TimeZoneOffset=date('Z') /60;
$JS="\n<script><!--\n";
$JS.="LocalTime = new Date();\n";
$JS.="TimeZoneOffsetInMins = LocalTime.getTimezoneOffset();\n";
$JS.="ServerTimeZoneOffset=$TimeZoneOffset;\n";
$JS.="timediff=-TimeZoneOffsetInMins - ServerTimeZoneOffset;\n";
$JS.="LocalTime = new Date(".$year.","
.($mon-1).",".$day.",".$hour.",".$min.",".$sec.");\n";
$JS.="DateVal=LocalTime.valueOf();\n";
$JS.="LocalTime=new Date(DateVal+timediff*1000*60);\n";
$JS.="document.write( LocalTime.toLocaleString());\n";
$JS.="//--></script>\n";
return $JS;
}`
Moritz Stoltenburg
17-Aug-2006 08: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.`
Arpad Borsos
17-Aug-2006 04: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]`
reeveboy at hotmail dot com
27-Jul-2006 09: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:
<?=date("jS", mktime(0,0,0,1,$myDay,2006))?>
Obviously, the only part of mktime that really matters is $myDay.`
Moritz Stoltenburg
22-Jul-2006 10: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'));
?>`
andy at yatescentral dot com
16-May-2006 08: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.`
posenato at sciNO dot univrSPAM dot it
14-May-2006 11: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)]`
Jon Keating
17-Jan-2006 05: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`
php at REMOVEMEkennel17 dot co dot uk
19-Dec-2005 04: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.`
zackbloom at gmail dot com
06-Dec-2005 05:54
`This function is useful for news posts.
It displays the creation date and elapsed time like:
Sunday, December 4, 2005 - 2 days ago
Monday, December 5, 2005 - Yesterday
Monday, November 28, 2005 - 1 week ago
Friday, October 28, 2005 - 6 weeks ago
function off($date){
$date = strtotime($date);
$offset = (strftime("%j")+strftime("%Y")*365)-
(strftime("%j",$date)+strftime("%Y",$date)*365);
if ($offset>7){
$offset = (strftime("%V")+strftime("%Y")*52)-
(strftime("%V",$date)+strftime("%Y",$date)*52);
$end=($offset!=0?($offset>1?$offset . " weeks ago":"a week ago"):"Today");
} else
$end=($offset!=0?($offset>1?"$offset days ago":"Yesterday"):"Today");
return strftime("%A, %B %e, %Y",$date)." - ". $end;
}
To insert the time:
<?=off("12/4/05")?>`
jw at jwscripts dot com
29-May-2005 06: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);
}
?>`
patrick at codeministry dot dk
20-Apr-2005 02: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.`
bohac at smartcat dot cz
19-Mar-2005 10: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`
Aaron
25-Jan-2005 01: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.`
michiel1978 at hotmail dot com
06-Oct-2004 02: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.`
neo at gothic-chat d0t de
24-Jun-2004 11: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().`
adan at cr72 dot com
09-Jun-2004 04:48
`For Spanish:
<?
setlocale(LC_ALL, "sp");
echo strftime("%d. %B %Y");
?>`
verhoeff
15-Apr-2004 03:54
`The locale for dutch on a win2k computer is not "nl_NL"
but "dutch".`
php_manual at it-rex dot nl
28-Mar-2004 05:31
`In the strftime override-function of rickenmeer at hotmail dot com there is an error.
The line:
$year = 1969;
should read:
$year = 1970;`
rolex
25-Mar-2004 08:37
`Searching for translation from IBASE-Timestamp to EU-Dateformat DD.MM.YYYY
strftime("%d.%m.%Y",strtotime($row->START_TIMESTAMP));
Maybe it's useful for somebody ;-)`
vminarik at ips-ag dot cz
10-Sep-2001 06: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.
<?
$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));
?>`
verdy_p at wanadoo dot fr
22-Jul-2001 05: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.`
spamyenot at example dot com
18-Jul-2001 11: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`
zmajeed at cup dot hp dot com
22-Jul-1999 03: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"));`
add a note
strptime mktime

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 09:32:46 2007 PST