<?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
*/
?>
strftime
(PHP 4, PHP 5)
strftime — Formate une date/heure locale avec la configuration locale
Description
Formate une date et/ou une heure suivant la localisation locale. Les noms des mois, des jours de la semaine mais aussi d'autres chaînes dépendant de la location, respecteront la localisation courante définie par la fonction setlocale().
Tous les caractères modificateurs ne sont pas toujours supportés par toutes les bibliothèques C. Dans ce cas, ils ne seront pas supportés par PHP non plus. De plus, toutes les plates-formes ne supportent pas les timestamps négatifs, et vos dates pourraient être limitées par le début de l'époque Unix. Cela signifie que %e, %T, %R et %D (et peut être d'autres) et les dates antérieures au 1er Janvier 1970 ne fonctionneront pas sous Windows, sur certaines distributions de Linux, et sur certains systèmes d'exploitation. Pour Windows, une liste complète des options de conversion est disponible sur le » site de MSDN.
Liste de paramètres
- format
-
Les caractères suivants sont reconnus dans le paramètre format format Description Exemple de valeurs retournées Jour --- --- %a Nom abrégé du jour de la semaine De Sun à Sat %A Nom complet du jour de la semaine De Sunday à Saturday %d Jour du mois en numérique, sur 2 chiffres (avec le zéro initial) De 01 à 31 %e Jour du mois, avec un espace précédant le premier chiffre De 1 à 31 %j Jour de l'année, sur 3 chiffres avec un zéro initial 001 à 366 %u Représentation ISO-8601 du jour de la semaine De 1 (pour Lundi) à 7 (pour Dimanche) %w Représentation numérique du jour de la semaine De 0 (pour Dimanche) à 6 (pour Samedi) Semaine --- --- %U Numéro de la semaine de l'année donnée, en commençant par le premier Lundi comme première semaine 13 (pour la 13ème semaine pleine de l'année) %V Numéro de la semaine de l'année, suivant la norme ISO-8601:1988, en commençant comme première semaine, la semaine de l'année contenant au moins 4 jours, et où Lundi est le début de la semaine De 01 à 53 (où 53 compte comme semaine de chevauchement) %W Une représentation numérique de la semaine de l'année, en commençant par le premier Lundi de la première semaine 46 (pour la 46ème semaine de la semaine commençant par un Lundi) Mois --- --- %b Nom du mois, abrégé, suivant la locale De Jan à Dec %B Nom complet du mois, suivant la locale De January à December %h Nom du mois abrégé, suivant la locale (alias de %b) De Jan à Dec %m Mois, sur 2 chiffres De 01 (pour Janvier) à 12 (pour Décembre) Année --- --- %C Représentation, sur 2 chiffres, du siècle (année divisée par 100, réduit à un entier) 19 pour le 20ème siècle %g Représentation, sur 2 chiffres, de l'année, compatible avec les standards ISO-8601:1988 (voyez %V) Exemple : 09 pour la semaine du 6 janvier 2009 %G La version complète à quatre chiffres de %g Exemple : 2008 pour la semaine du 3 janvier 2009 %y L'année, sur 2 chiffres Exemple : 09 pour 2009, 79 pour 1979 %Y L'année, sur 4 chiffres Exemple : 2038 Heure --- --- %H L'heure, sur 2 chiffres, au format 24 heures De 00 à 23 %I Heure, sur 2 chiffres, au format 12 heures De 01 à 12 %l ('L' minuscule) Heure, au format 12 heures, avec un espace précédant de complétion pour les heures sur un chiffre De 1 à 12 %M Minute, sur 2 chiffres De 00 à 59 %p 'AM' ou 'PM', en majuscule, basé sur l'heure fournie Exemple : AM pour 00:31, PM pour 22:23 %P 'am' ou 'pm', en minuscule, basé sur l'heure fournie Exemple : am pour 00:31, pm pour 22:23 %r Identique à "%I:%M:%S %p" Exemple : 09:34:17 PM pour 21:34:17 %R Identique à "%H:%M" Exemple : 00:35 pour 12:35 AM, 16:44 pour 4:44 PM %S Seconde, sur 2 chiffres De 00 à 59 %T Identique à "%H:%M:%S" Exemple : 21:34:17 pour 09:34:17 PM %X Représentation de l'heure, basée sur la locale, sans la date Exemple : 03:59:16 ou 15:59:16 %z Soit le décalage horaire depuis UTC, ou son abréviation (suivant le système d'exploitation) Exemple : -0500 ou EST pour l'heure de l'Est %Z Le décalage horaire ou son abréviation NON fournie par %z (suivant le système d'exploitation) Exemple : -0500 ou EST pour l'heure de l'Est L'heure et la date --- --- %c Date et heure préférées, basées sur la locale Exemple : Tue Feb 5 00:45:10 2009 pour le 4 Février 2009 à 12:45:10 AM %D Identique à "%m/%d/%y" Exemple : 02/05/09 pour le 5 Février 2009 %F Identique à "%Y-%m-%d" (utilisé habituellement par les bases de données) Exemple : 2009-02-05 pour le 5 février 2009 %s Timestamp de l'époque Unix (identique à la fonction time()) Exemple : 305815200 pour le 10 Septembre 1979 08:40:00 AM %x Représentation préférée de la date, basée sur la locale, sans l'heure Exemple : 02/05/09 pour le 5 Février 2009 Divers --- --- %n Une nouvelle ligne ("\n") --- %t Une tabulation ("\t") --- %% Le caractère de pourcentage ("%") --- La longueur maximale de ce paramètre est de 1023 caractères.
AvertissementContrairement à la norme ISO-9889:1999, Sun Solaris commence avec le Dimanche à 1. Aussi, le format %u ne fonctionnera pas tel que décrit dans ce manuel.
- timestamp
-
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Valeurs de retour
Retourne une chaîne de caractères formatée suivant le paramètre format donné, en utilisant le paramètre timestamp ou la date locale courante si aucun timestamp n'est fourni. Les noms des mois, des jours de la semaine mais aussi d'autres chaînes dépendant de la location, respecteront la localisation courante définie par la fonction setlocale().
Erreurs / Exceptions
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
Historique
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemples
Cet exemple ne fonctionnera que si vous avez les locales respectives installées sur votre système.
Exemple #1 Exemple avec 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");
?>
Exemple #2 Exemple au format de date ISO 8601:1988
<?php
/* December 2002 / January 2003
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
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 */
// Affiche : 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";
// Affiche : 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";
// Affiche : 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";
// Affiche : 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";
/* December 2004 / January 2005
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
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 */
// Affiche : 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";
// Affiche : 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";
// Affiche : 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";
// Affiche : 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 et %V, qui sont basées sur la semaine ISO 8601:1988, peut conduire à des résultat inattendus (bien que corrects) si le système de numérotation n'est pas connu. Voir l'exemple %V de cette page.
Voir aussi
- setlocale() - Modifie les informations de localisation
- mktime() - Retourne le timestamp UNIX d'une date
- strptime() - Analyse une date générée par strftime
- gmstrftime() - Formate une date/heure GMT/CUT en fonction de la configuration locale
- » groupe de spécifications de strftime()
strftime
20-May-2009 02:01
18-May-2009 10:12
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
16-Mar-2009 10:21
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
04-Dec-2008 06:37
<?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
?>
05-Nov-2008 02:24
for Arabic
<?php
setlocale(LC_ALL,'ar');
echo strftime('%A %d %B %Y');
?>
22-Oct-2008 10:33
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
21-Aug-2008 03:51
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");
?>
09-Mar-2008 03: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 =)
07-Nov-2007 08: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));
}
}
}
?>
31-Aug-2007 01: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 12: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 12: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 05: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 08: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]
18-Jan-2006 01: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
29-May-2005 01: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);
}
?>
25-Jun-2004 06: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-Sep-2001 01: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-1999 10: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:
<?php
setlocale("LC_TIME", "de_DE.roman8");
print(strftime("%A\n"));
?>
