 |
date (PHP 3, PHP 4, PHP 5) date -- 格式化一个本地时间/日期 说明string date ( string format [, int timestamp] )
返回将整数 timestamp
按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp
是可选的,默认值为 time()。
提示:
自 PHP 5.1.0 起有几个有用的常量可用作标准的日期/时间格式来指定
format 参数。
注:
有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54
到 2038 年 1 月 19 日 03:14:07。(此范围符合 32
位有符号整数的最小值和最大值)。不过在 PHP 5.1 之前此范围在某些系统(如
Windows)中限制为从 1970 年 1 月 1 日到 2038 年 1 月 19 日。
表格 1. 格式字串可以识别以下 format 参数的字符串 format 字符 | 说明 | 返回值例子 |
---|
日 | --- | --- | d | 月份中的第几天,有前导零的 2 位数字 | 01 到 31 | D | 星期中的第几天,文本表示,3 个字母 | Mon 到 Sun | j | 月份中的第几天,没有前导零 | 1 到 31 | l(“L”的小写字母) | 星期几,完整的文本格式 | Sunday 到 Saturday | N | ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) | 1(表示星期一)到 7(表示星期天) | S | 每月天数后面的英文后缀,2 个字符 | st,nd,rd
或者 th。可以和 j 一起用 | w | 星期中的第几天,数字表示 | 0(表示星期天)到 6(表示星期六) | z | 年份中的第几天 | 0 到 366 | 星期 | --- | --- | W | ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) | 例如:42(当年的第 42 周) | 月 | --- | --- | F | 月份,完整的文本格式,例如 January 或者 March | January 到 December | m | 数字表示的月份,有前导零 | 01 到 12 | M | 三个字母缩写表示的月份 | Jan 到 Dec | n | 数字表示的月份,没有前导零 | 1 到 12 | t | 给定月份所应有的天数 | 28 到 31 | 年 | --- | --- | L | 是否为闰年 | 如果是闰年为 1,否则为 0 | o | ISO-8601 格式年份数字。这和
Y 的值相同,只除了如果 ISO
的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) | Examples: 1999 or 2003 | Y | 4 位数字完整表示的年份 | 例如:1999 或 2003 | y | 2 位数字表示的年份 | 例如:99 或 03 | 时间 | --- | --- | a | 小写的上午和下午值 | am 或 pm | A | 大写的上午和下午值 | AM 或 PM | B | Swatch Internet 标准时 | 000 到 999 | g | 小时,12 小时格式,没有前导零 | 1 到 12 | G | 小时,24 小时格式,没有前导零 | 0 到 23 | h | 小时,12 小时格式,有前导零 | 01 到 12 | H | 小时,24 小时格式,有前导零 | 00 到 23 | i | 有前导零的分钟数 | 00 到 59> | s | 秒数,有前导零 | 00 到 59> | 时区 | --- | --- | e | 时区标识(PHP 5.1.0 新加) | 例如:UTC,GMT,Atlantic/Azores | I | 是否为夏令时 | 如果是夏令时为 1,否则为 0 | O | 与格林威治时间相差的小时数 | 例如:+0200 | T | 本机所在的时区 | 例如:EST,MDT(【译者注】在 Windows
下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。 | Z | 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 | -43200 到 43200 | 完整的日期/时间 | --- | --- | c | ISO 8601 格式的日期(PHP 5 新加) | 2004-02-12T15:19:21+00:00 | r | RFC 822 格式的日期 | 例如:Thu, 21 Dec 2000 16:01:07 +0200 | U | 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 | 参见 time() |
格式字串中不能被识别的字符将原样显示。Z 格式在使用
gmdate() 时总是返回 0。
例子 1. date() 例子
<?php // 设定要用的默认时区。自 PHP 5.1 可用 date_default_timezone_set('UTC');
// 输出类似:Monday echo date("l");
// 输出类似:Monday 15th of August 2005 03:12:46 PM echo date('l dS \of F Y h:i:s A');
// 输出:July 1, 2000 is on a Saturday echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* 在格式参数中使用常量 */ // 输出类似:Mon, 15 Aug 2005 15:12:46 UTC echo date(DATE_RFC822);
// 输出类似:2000-07-01T00:00:00+0000 echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000)); ?>
|
|
在格式字串中的字符前加上反斜线来转义可以避免它被按照上表解释。如果加上反斜线后的字符本身就是一个特殊序列,那还要转义反斜线。
例子 2. 在 date() 中转义字符
<?php // prints something like: Wednesday the 15th echo date("l \\t\h\e jS"); ?>
|
|
可以把 date() 和
mktime() 结合使用来得到未来或过去的日期。
例子 3. date() 和 mktime() 例子
<?php $tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y")); $lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y")); $nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1); ?>
|
|
注:
由于夏令时的缘故,这种方法比简单地在时间戳上加减一天或者一个月的秒数更可靠。
一些使用 date()
格式化日期的例子。注意要转义所有其它的字符,因为目前有特殊含义的字符会产生不需要的结果,而其余字符在
PHP 将来的版本中可能会被用上。当转义时,注意用单引号以避免类似 \n 的字符变成了换行符。
例子 4. date() 格式举例
<?php // 假定今天是:March 10th, 2001, 5:16:18 pm $today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm $today = date("m.d.y"); // 03.10.01 $today = date("j, n, Y"); // 10, 3, 2001 $today = date("Ymd"); // 20010310 $today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01 $today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day. $today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001 $today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month $today = date("H:i:s"); // 17:16:17 ?>
|
|
要格式化其它语种的日期,应该用 setlocale() 和
strftime() 函数。
参见 getlastmod(),gmdate(),mktime(),strftime()
和 time()。
tam at zenology dot co dot uk
18-May-2006 09:02
/* Here's a simple function which takes a UNIX timestamp and returns a fuzzy date string such as 'Yesterday 10:24', 'Wednesday 23:11', 'April 12' or 'June 2003'. It's only set up to handle dates in the past but it's easy to see how to extend it to do future dates too. */
function fuzzyDate($timestamp)
{
if($timestamp > time())
//we don't handle future dates
return date('Y-m-d H:i', $timestamp);
elseif($timestamp > mktime(0,0,0))
//since midnight so it's today
return 'Today '.date('H:i', $timestamp);
elseif($timestamp > mktime(0,0,0) - 86400)
//since midnight 1 day ago so it's yesterday
return 'Yesterday '.date('H:i', $timestamp);
elseif($timestamp > mktime(0,0,0) - 86400*7)
//since midnight 7 days ago so it's this week
return date('l H:i', $timestamp);
elseif($timestamp > mktime(0,0,0,1,1))
//since 1st Jan so it's this year
return date('F j', $timestamp);
else
//ages ago!
return date('F Y', $timestamp);
}
Elena S.
06-May-2006 05:36
If you do not PHP5 yet but want a week day to be in ISO format: 1 (for Monday) through 7 (for Sunday), you can use this:
<?
//GET WEEK DAY 0 FOR SUNDAY, 6 FOR SATURDAY
$x = date( "w" );
$corrected_week_day = 7 - ( (7-$x) % (7+$x) );
?>
mel dot boyce at gmail dot com
06-Apr-2006 07:46
I've been flicking through the comments looking for some succinct date code and have noticed an alarming number of questions and over-burdened examples related to date mathematics. One of the most useful skills you can utilize when performing date math is taking full advantage of the UNIX timestamp. The UNIX timestamp was built for this kind of work.
An example of this relates to a comment made by james at bandit-dot-co-dot-en-zed. James was looking for a way to calculate the number of days which have passed since a certain date. Rather than using mktime() and a loop, James can subtract the current timestamp from the timestamp of the date in question and divide that by the number of seconds in a day:
<?php
$days = floor((time() - strtotime("01-Jan-2006"))/86400);
print("$days days have passed.\n");
?>
Another usage could find itself in a class submitted by Kyle M Hall which aids in the creation of timestamps from the recent past for use with MySQL. Rather than the looping and fine tuning of a date, Kyle can use the raw UNIX timestamps (this is untested code):
<?php
$ago = 14; // days
$timestamp = time() - ($ago * 86400);
?>
Hopefully these two examples of "UNIX-style" timestamp usage will help those finding date mathematics more elusive than it should be.
SpikeDaCruz
10-Mar-2006 03:12
The following function will return the date (on the Gregorian calendar) for Orthodox Easter (Pascha). Note that incorrect results will be returned for years less than 1601 or greater than 2399. This is because the Julian calendar (from which the Easter date is calculated) deviates from the Gregorian by one day for each century-year that is NOT a leap-year, i.e. the century is divisible by 4 but not by 10. (In the old Julian reckoning, EVERY 4th year was a leap-year.)
This algorithm was first proposed by the mathematician/physicist Gauss. Its complexity derives from the fact that the calculation is based on a combination of solar and lunar calendars.
<?
function getOrthodoxEaster($date){
/*
Takes any Gregorian date and returns the Gregorian
date of Orthodox Easter for that year.
*/
$year = date("Y", $date);
$r1 = $year % 19;
$r2 = $year % 4;
$r3 = $year % 7;
$ra = 19 * $r1 + 16;
$r4 = $ra % 30;
$rb = 2 * $r2 + 4 * $r3 + 6 * $r4;
$r5 = $rb % 7;
$rc = $r4 + $r5;
//Orthodox Easter for this year will fall $rc days after April 3
return strtotime("3 April $year + $rc days");
}
?>
rob at robmacdonald dot com
05-Feb-2006 06:24
This function takes a YEARWEEK value (most commonly returned from mysql) and examines it to get the start date and end date for the given YEARWEEK. May be of use to someone...
function findWeekPeriod($yearweek){
$aPeriod = array();
$year = substr($yearweek,0,4);
$week = substr($yearweek,4,2);
$startDay = Mon;
$endDay = Sun;
$startdate = strtotime('+' . $week . ' week',mktime(0,0,0,1,1,$year));
$enddate = $startdate;
while(date("D",$startdate) != $startDay){
$startdate = mktime(0,0,0,date("m",$startdate),date("d",$startdate)-1, date("Y",$startdate));
}
while(date("D",$enddate) != $endDay){
$enddate = mktime(0,0,0,date("m",$enddate),date("d",$enddate)+1, date("Y",$enddate));
}
return array('start' => date('l d/m/y', $startdate),
'end' => date('l d/m/y', $enddate));
return $aPeriod;
}
martin dot m at hid dot gr
20-Dec-2005 12:25
"It worked ok, except I noticed it had some trouble if you were spanning months, (i.e. 03-29-2005 to 04-10-2005)"
this is the (Daylight Saving Time ) problem. you can check if the start date and the end date are
whether or not in daylights savings time by using
date('I',$your_date) and to add or decrease with one hour.
itsacon at itsacon dot net
16-Nov-2005 06:28
Caveat when using the 'W' and 'w' options together:
The 'W' option uses the ISO-8601 standard (week ends on sunday), whereas the 'w' option has the week _start_ on sunday (sunday == 0).
vernon at vernonkesner dot com
03-Nov-2005 01:37
The examples for getting a date in the past or future is simply not the best way to do it. Especially if you are doing it dynamically.
I find the best way to get a date in the past or future is like this:
<?php
//get timestamp for past/future date I want
$pf_time = strtotime("-3 days");
//format the date using the timestamp generated
$pf_date = date("Y-m-d", $pf_time);
?>
martin at kurahaupo dot gen dot nz
31-Oct-2005 05:52
There is a mistaken impression that the maximum difference between UTC and localtime is +/- 12 hours. Right now it is summer here in New Zealand, and we're 13 hours ahead of UTC, and further east in the Chatham Islands it's UTC+13:45.
Consequently, the range for the "Z" conversion is at least -43200 ... +49500
mbirth at webwriters dot de
25-Oct-2005 06:24
Using 'B' for the Swatch Internet Time (i.Beats) can still lead to misunderstandings, because the date given in the resulting string is the local date, not the date of the BMT (Biel Mean Time / UTC+0100) after which the i.Beats are counted. So while @000 is equal all around the globe, October 25th 2005 @000 in Chicago is really October 24th, 06:00 PM local time.
Otherwise, if you use date('d M Y @B') in Chicago on that day at 6pm, it will return "24 Oct 2005 @000" although it should be "25 Oct 2005 @000".
So it may happen that you miss an appointment by 24 hours (or 1000 Beats ;-)
Here's a way to return the Internet Time with correct date:
<?php
$curtime = time();
$utcdiff = date('Z', $curtime); // get difference to UTC in seconds
$bmttime = $curtime - $utcdiff + 3600; // BMT = UTC+0100
$ssm = date('H', $bmttime)*3600 + date('i', $bmttime)*60 + date('s', $bmttime); // seconds since midnight (BMT)
$ibeats = $ssm/86.4; // 86400 seconds = 1000 beats, so 1 beat = 86.4 seconds
echo 'i.Beats : ' . date('D, d M Y', $bmttime) . ' @' . $ibeats;
?>
Note: If you would try date('D, d M Y @B', $bmttime), the resulting beats would be wrong because the timezone used for calculation of the beats within the date() function is still your local one but the timestamp is UTC+0100. Another working way would be:
<?php
$curtime = time();
$utcdiff = date('Z', $curtime); // get difference to UTC in seconds
$bmttime = $curtime - $utcdiff + 3600; // BMT = UTC+0100
echo 'i.Beats : ' . date('D, d M Y', $bmttime) . ' @' . date('B', $curtime);
?>
But this way there are no floating-point beats possible, which may be handy sometimes.
mendoza at pvv dot ntnu dot no
14-Oct-2005 01:38
At "daykay at pdsoftware dot de":
09 != 9 so there's nothing wrong about European vs. American formats.
$ php -r 'print 09; print "\n"; print 9; print "\n";'
0
9
09 is treated as octal and since octal numbers only use the 0-7 digits, it evaluates to 0. All numbers prefixed with 0 are considered octal just as 0x are considered hexadecimal.
http://en.wikipedia.org/wiki/Computer_numbering_formats
jim at catsanddogs dot com
12-Oct-2005 06:52
To get the start date for a working week:
<?php
list($iDay, $iMonth, $iYear) = split('-', date('d-m-Y', mktime(0, 0, 0, date('n'), ((date('j')+1)-date('w')), date('Y'))));
return $iDay.'-'.$iMonth.'-'.$iYear;
?>
kbrill at multi dot com
15-Sep-2005 11:27
I created a routine that fills an array with the dates in the current week. For example $WeekDays[0] is sunday's date, $WeekDays[1] is monday's date and so on no matter what day of the week it is today.
<?php
$lowEnd=date("w");
$lowEnd=-$lowEnd;
$highEnd=$lowEnd + 6;
$weekday=0;
for ($i=$lowEnd; $i<=$highEnd; $i++) {
$WeekDate[$weekday]=date("m/d",mktime(0, 0, 0, date("m") , date("d")+$i, date("Y")));
$weekday++;
}
?>
webmaster [AT] gn-solutions [DOT] de
07-Sep-2005 07:19
For users who want a different language than english, you can user strftime() function in combination with setlocale() instead of date():
e.g. for german language:
With date you would write:
<?php
echo date('l, d. F Y'); //Output: Wednesday, 07. September 2005
?>
With strftime() you can output it in german like this:
<?php
// Set the gloabal LC_TIME constant to german
setlocale(LC_TIME, 'de_DE');
// Little bit other Syntax but better effect
echo strftime('%A, %d. %B %Y'); //Output: Mittwoch, 07. September 2005
?>
Greetings, Andy!
steve at somejunkwelike dot com
17-Aug-2005 02:01
re: Paul_liversidge...
This is a way to get the next 10 business days, by comparing the day of the week to not be saturday or sunday. change the top two variables to get various different results... if you want to get the next 10 business days, starting in two days from today, change the first variable to 2, and the second to 14. This should yield the next 10 working days.
<?php
$how_many_business_days_ahead = 0;
$how_many_business_days_to_count = 7;
for ($i=0;$i<$how_many_business_days_to_count;$i++)
{
$jump=$i+$how_many_business_days_ahead;
$evalday = mktime(strftime ("%d/%m/%Y", strtotime("+$jump days")));
$theday = strftime("%A", strtotime("+$jump days"));
if($theday != "Saturday" and $theday != "Sunday")
{
$days = $how_many_business_days_ahead+$i;
$the_days[$j] = strftime("%A, %B %d, %Y", strtotime("+$jump days"));
$j++;
}
}
$k = $how_many_business_days_ahead;
foreach($the_days as $eachday)
{
echo "$k business days from now = $eachday<br />";
$k++;
}
?>
results:
0 business days from now = Tuesday, August 16, 2005
1 business days from now = Wednesday, August 17, 2005
2 business days from now = Thursday, August 18, 2005
3 business days from now = Friday, August 19, 2005
4 business days from now = Monday, August 22, 2005
Rob Muhlestein
06-Aug-2005 01:48
All functions that have anything to do with the internal 32-bit constrained time() system call will have this same limitation. Hopefully we'll be 64 bit by long before then, although this already creating problems with UNIX internals.
ove at junne dot dk
03-Aug-2005 02:39
I seems to me that we're rapidly apporaching another Y2K event. The date-function only handles dates up to 2038, and this is only some 30 years away. Even today is it impossible to use date() to represent my children's 50 years birthday.
Just think about it, when you're designing your code.
[ed.: This limitation is gone in PHP 5.1 and higher, although PHP itself limits integers still to 32bit]
stuff at rushsoft dot de
30-Jun-2005 05:13
ISO 8601:2000 defines:
[...] day of the year is represented by three decimal digits. The first day of any year is represented by [001] and
subsequent days are numbered in ascending sequence [...]
So don't forget increasing the return value of date("z") by one to be ISO conform, if you use this, for instance, on presentation level.
witcho at gmail dot com
08-Jun-2005 12:22
When using 'z' it should be used as how many days have passed since the beginning of the year; not as the day of the year.
"January 1" is the day 1 of the year not the day 0.
Better to add 1 when using 'z' if you really want to know the day of the year.
justin at drunkatgt dot com
04-Jun-2005 11:24
In response to pmcdevitt(at)cesales.com:
If you just want to find out what last month was, try
$lastmonth=mktime(0,0,0,date("m")-1,1,date("Y"));
$lastmonth= date("M", $lastmonth);
There is no reason to use the day of the month to determine the revious month. And every month has a 1st. You could even through an arbitrary year in there to save a fraction of a calculation.
MG_Peter at o2 dot pl
30-Apr-2005 08:05
easy way - to convert a "datetime" form mySQL into php date format....
first - get the array form mySQL, then use
<?php
date("d M Y H:i:s", strtotime($your_row['lastlogin_date']))
?>
strtotime - easy converts a datetime timestamp into time ( time() or date("U")).
llewellyntd at gmail dot com
29-Apr-2005 08:50
Here is a very easy way to get the difference, in days, between two dates:
$days = (strtotime("2005-12-31") - strtotime(date("Y-m-d"))) / (60 * 60 * 24);
print $days;
rcrodgers622 at gmail dot com
26-Mar-2005 02:08
Regarding dolso at elastech dot it's note, it's actually easier to use the 't' item to get the last day of any given month.
echo 'February ' . date('t',mktime(0,0,0,2,1,2004)) . ' is the last day of February 2004';
//Displays "The February 29 is the last day of February 2004"
The actual day of the month specified in mktime() is irrelevant, but it's best and safest to use a day that won't alter the results such as the first of the month.
jon AT standardise DOT us
16-Feb-2005 12:57
Don't forget that months start on the 1st day, and not a zero date. Might seem obvious but:
$test = date("F Y", mktime(0, 0, 0, 12, 0, 2005));
Will return November 2005, not December.
$test = date("F Y", mktime(0, 0, 0, 12, 1, 2005));
The 1st is needed to get the right month.
ag nodot nospam at netside dot de
28-Jan-2005 11:19
Calculus of weeks in a year.
Since there is date("W") many still seem to have a problem regarding how many weeks there are in an year. Some rather complex solutions have been shown here.
It's defined, that a week which begins in december and ends in january the following year belongs to the year where most of its days lie. Therefore a week with at least 4 days in december is the last week of that year and a week with at least 4 days in january is the first week in the new year.
This concludes, that the last week of a year always contains the 28th day of december. So if you take date("W") on that day of a given year you always get the correct number of weeks for that year.
The other end of that definition is that the 4th day of january always lies in the first week of a year.
I hope this solves a lot of confusion.
(For those asking what all this fuzz about counting weeks is about: normally theres 52 weeks in a year but sometimes its 53 weeks in a year)
I wrote it down as a function, but as this is rather trivial one might consider using the date(...) only.
function weeks($year) {
return date("W",mktime(0,0,0,12,28,$year));
}
php at document-root dot de
15-Apr-2004 01:02
To convert an unix timestamp to suite the syntax of a GeneralizedTime attribute for OpenLDAP, you can use
date ('YmdHiZO'). Note that this conversion uses local time, the recommended way is to store dates in UTC.
If your date is in UTC, just use
date ('YmdHiZ').'Z' to convert it ("Z" stands for "Zulu", which is UTC).
daniel
18-Feb-2004 06:43
The following function will return the date (on the Gregorian calendar) for Orthodox Easter (Pascha). Note that incorrect results will be returned for years less than 1601 or greater than 2399. This is because the Julian calendar (from which the Easter date is calculated) deviates from the Gregorian by one day for each century-year that is NOT a leap-year, i.e. the century is divisible by 4 but not by 10. (In the old Julian reckoning, EVERY 4th year was a leap-year.)
This algorithm was first proposed by the mathematician/physicist Gauss. Its complexity derives from the fact that the calculation is based on a combination of solar and lunar calendars.
<?
function getOrthodoxEaster($date){
/*
Takes any Gregorian date and returns the Gregorian
date of Orthodox Easter for that year.
*/
$year = date("Y", $date);
$r1 = $year % 19;
$r2 = $year % 4;
$r3 = $year % 7;
$ra = 19 * $r1 + 16;
$r4 = $ra % 30;
$rb = 2 * $r2 + 4 * $r3 + 6 * $r4;
$r5 = $rb % 7;
$rc = $r4 + $r5;
//Orthodox Easter for this year will fall $rc days after April 3
return strtotime("3 April $year + $rc days");
}
?>
|  |