php函数的多样化和功能相近真是一大特点,同一个应用可以用多种函数实现,这恐怕也是开源的一个弊端了;
通过对PHP时间函数的系统学习,充分理解了时间戳和时区的概念(这个真的很重要);
本人把时间函数区分为了时间戳函数(返回值为时间戳)和格式化时间函数(返回时间格式的字串或数组);
在时间戳函数中,当然time()函数是最重要的了,但是他只能返回当前时间戳,如果需要返回指定时间的时间戳需要使用strtotime()或mktime()函数,其中mktime()函数的源时间格式比较固定,而strtotime()就非常灵活了,不仅支持字串的时间按格式,如('Y-m-d H:i:s'),而且可以通过英文的时间描述,计算时间的偏移。
另外在时间戳函数中还有一个函数在计算程序运行时间中经常使用:microtime(),返回时间的微秒值。
在格式化时间函数中,最重要的当然是date()函数,通过各种format样式可以组合出所有时间格式,个人认为其他的格式函数有如鸡肋,本人一直用编码‘utf-8’,而strftime()函数需要setlocale()函数的配合,如果设置为‘chs’,会显示为乱码(编码不支持,需要再用iconv()函数做一个编码转换)
下面就PHP的时间函数做详细介绍,也算本人的学习笔记吧:
设定系统默认时区 date_default_timezone_get()
返回系统默认时区 date_default_timezone_set($tz)
说明:PHP5.1版本开始,时间函数重写了,引入了时区设定,可以通过设定php.ini中的date.timezone项设定系统默认时区;也可以通过以上函数在程序中设定。
常用的时区:
格林威治标准时间 UTC 或 Europe/Lisbon (默认)
GMT-8时区(即北京时间)
大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)
港台地区 Asia/Macao(澳门),Asia/Hong_Kong (香港),Asia/Taipei(台北),Asia/Singapore(新加坡)
老外把北京漏掉了,可以用 Etc/GMT-8 ,Singapore ,Hongkong ,PRC
更多时区请查询:
http://www.php.net/manual/en/timezones.php
checkdate(month,day,year)
验证一个格里高里日期,如果指定的值合法则返回true,否则返回false
参数 | 描述 |
---|---|
month | 必需。规定月。 |
day | 必需。规定日。 |
year | 必需。规定年。 |
Example1
var_dump(checkdate(12,31,2008));
var_dump(checkdate(2,29,2009));
#返回:
bool(true)
bool(false)
第一部分 Unix时间戳相关函数
——Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
32位系统,会引发2038年问题
time()
返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳,即time()=$_SERVER['REQUEST_TIME']
返回值不会随时区的变化而改变
Example 1:
echo time();
echo $_SERVER['REQUEST_TIME']
#返回:
1252289036
1252289036
mktime(hour,minute,second,month,day,year,is_dst)
返回一个日期的 Unix 时间戳。
参数说明:
hour (可选) 规定小时。
minute (可选) 规定分钟。
second (可选) 规定秒。
month (可选) 规定用数字表示的月。
day (可选) 规定天。
year (可选) 规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。
is_dst (可选) 如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。
参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。
参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。
注释:
自 5.1.0 起,is_dst 参数被废弃。因此应该使用新的时区处理特性。
自 5.1.0 器,该函数自动校正越界的输入,而之前的版本会返回false
Example 1:
$t = mktime(0,0,0,12,36,2001);
echo $t;
echo '<br />';
echo date('Y-m-d H:i:s', $t);
#返回:
1010188800
2002-01-05 00:00:00
gmmktime(hour,minute,second,month,day,year,is_dst)
取得 GMT 日期的 UNIX 时间戳。
与 mktime() 类似,不同的是返回值是格林威治标准时的时间戳(注:GMT时间值根据时区的设置不同,本函数的GMT日期的时区为UTC即格林威治标准时间, 返回值不会随时区设置‘date_default_timezone_set()’的变化而变化)
参数及注释同mktime();
Example 1:
$tg = gmmktime(0,0,0,12,36,2001);
echo $tg;
echo '<br />';
echo date('Y-m-d H:i:s', $tg);
#返回:
1010188800
2002-01-05 00:00:00
strtotime(time,now)
将任何英文文本的日期时间描述解析为 Unix 时间戳。
参数:
time 要解析的时间描述字符串(英文文本形式)
date time相对的时间戳,省略该参数,默认为当前时间戳
注释:
该函数使用当期时区设置(date_default_timezone_set)来计算时间戳
time 的描述是相对于date值的
Example 1:
date_default_timezone_set('PRC');
echo strtotime('3 October 2008').'<br />';
echo strtotime('now').'<br />';
echo strtotime('+1 hours').'<br />';
echo strtotime('next month').'<br />';
echo strtotime('last monday').'<br />';
echo strtotime('+1 week 1 days 6 hours 16 seconds');
#返回
1222963200
1252295751
1252299351
1254887751
1251648000
1253008567
microtime(get_as_float)
返回当前 Unix 时间戳和微秒数。
参数:
get_as_float (可选) 等价于 TRUE,该函数将返回一个浮点数
注释:
不带参数是返回格式:“msec sec”;sec为秒数,msec为微秒数,均以‘秒’为单位
带参数则返回一个浮点数
Example 1:
echo microtime();
echo '<br />';
echo microtime(true);
#返回:
0.10937700 1252296458
1252296458.1094
gettimeofday(return_float)
返回一个包含当前时间信息的数组
参数:
return_float (可选) 当其设置为 TRUE 时,gettimeofday() 会返回一个浮点数。
注释:
返回数组键及其说明
"sec" - 自 Unix 纪元起的秒数
"usec" - 微秒数
"minuteswest" - 格林威治向西的分钟数
"dsttime" - 夏令时修正的类型
Example 1:
echo gettimeofday(true).'<br />';
print_r(gettimeofday());
#返回:
1252307184.5781
Array ( [sec] => 1252307184 [usec] => 578148 [minuteswest] => 0 [dsttime] => 0 )
第二部分 格式化时间相关函数
date(format,timestamp)
格式化一个本地时间/日期。
参数:
format 返回结果格式
timestamp (可选) 被格式话的时间戳值,默认为当前时间戳
注释:
年 大写Y、小写y (大写Y表示年四位数字,而小写y表示年的两位数字);
月 大写F、大写M、小写m、小写n (大写F表示月份的英文全称,大写M表示月份的3个缩写字母,小写m表示带前导的数字,小写n表示不带前导数字)
日 小写d、小写j、大写S (小写s表示带前导的数字,小写j表示不带前导数字,大写S表示日期后缀)
时 大写H、小写h、大写G、小写g、大写A、小写a (大写H表示24时制带前导,而小写h不带前导;大写G表示12时制带前导,而小写g不带前导;大写A表示大写的AM或PM,而小写a表示小写的am或pm)
分 小写i (小写i表示带前导的数字)
秒 小写s (小写s表示带前导的数字)
星期 小写w、大写W、小写l、大写D (小写w表示数字形式星期几,大写W表示一年中的星期数,带前导,小写i表示星期英文全称,大写D表示英文缩写)
其他 比如闰年、时间戳、夏令时等请参阅下表:
表1:可识别format参数及说明
表 1. 格式字串可以识别以下 format 参数的字符串
format 字符 | 说明 | 返回值例子 |
---|---|---|
日 | --- | --- |
d | 月份中的第几天,有前导零的 2 位数字 | 01 到 31 |
j | 月份中的第几天,没有前导零 | 1 到 31 |
S | 每月天数后面的英文后缀,2 个字符 | st,nd,rd 或者 th。可以和 j 一起用 |
z | 年份中的第几天 | 0 到 366 |
星期 | --- | --- |
l(“L”的小写字母) | 星期几,完整的文本格式 | Sunday 到 Saturday |
D | 星期中的第几天,文本表示,3 个字母 | Mon 到 Sun |
N | ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) | 1(表示星期一)到 7(表示星期天) |
w | 星期中的第几天,数字表示 | 0(表示星期天)到 6(表示星期六) |
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 |
P | 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) | 例如:+02:00 |
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() |
Example 1:
echo date('Y-m-d H:i:s');
#返回:
2009-09-07 06:42:48
getdate(timestamp)
取得日期/时间信息
参数:
timestamp Unix时间戳格式的时间,为空则默认为当前时间
注释:
返回一个根据 timestamp 得出的包含有日期信息的结合数组。
数组的单元名称及说明:
键名 | 说明 | 返回值例子 |
---|---|---|
"seconds" | 秒的数字表示 | 0 到 59 |
"minutes" | 分钟的数字表示 | 0 到 59 |
"hours" | 小时的数字表示 | 0 到 23 |
"mday" | 月份中第几天的数字表示 | 1 到 31 |
"wday" | 星期中第几天的数字表示 | 0(表示星期天)到 6(表示星期六) |
"mon" | 月份的数字表示 | 1 到 12 |
"year" | 4 位数字表示的完整年份 | 例如:1999 或 2003 |
"yday" | 一年中第几天的数字表示 | 0 到 365 |
"weekday" | 星期几的完整文本表示 | Sunday 到 Saturday |
"month" | 月份的完整文本表示 | January 到 December |
0 | 自从 Unix 纪元开始至今的秒数,和 time() 的返回值以及用于 date() 的值类似。 | 系统相关,典型值为从 -2147483648 到 2147483647。 |
Example 1:
print_r(getdate());
#返回:
Array ( [seconds] => 46 [minutes] => 35 [hours] => 6 [mday] => 7 [wday] => 1 [mon] => 9 [year] => 2009 [yday] => 249 [weekday] => Monday [month] => September [0] => 1252305346 )
idate(format,timestamp)
将本地时间/日期格式化为整数
与 date() 不同,idate() 只接受一个字符作为 format 参数
参数:
format 格式字符
timestamp 可选项,默认值为本地当前时间,即 time() 的值
注释:
format 字符 | 描述 |
---|---|
B | Swatch Beat/Internet Time |
d | 月份中的第几天 |
h | 小时(12 小时格式) |
H | 小时(24 小时格式) |
i | 分钟 |
I | 如果启用夏时制则返回 1,否则返回 0 |
L | 如果是闰年则返回 1,否则返回 0 |
m | 月份的数字 |
s | 秒数 |
t | 本月的总天数 |
U | 自 Unix 纪元(January 1 1970 00:00:00 GMT)起的秒数――这和 time() 作用相同 |
w | 星期中的第几天(星期天是 0) |
W | ISO-8601 格式年份中的第几个星期,每星期从星期一开始 |
y | 年份(1 或 2 位数字――见下面说明) |
Y | 年份(4 位数字) |
z | 年份中的第几天 |
Z | 以秒为单位的时区偏移量 |
gmdate(format,timestamp)
格式化 GMT/UTC 日期/时间
同 date() 函数 类似,不同的是返回的时间是格林威治标准时间(GMT)。
Example 1:
date_default_timezone_set('PRC');
echo date('Y-m-d H:i:s');
echo '<br />';
echo gmdate('Y-m-d H:i:s');
#返回:
2009-09-07 15:16:23
2009-09-07 07:16:23
strftime(format,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)。和 %V 的格式和值一样,只除了如果 ISO 星期数属于前一年或者后一年,则使用那一年。
%h - 和 %b 一样
%H - 24 小时制的十进制小时数(范围从 00 到 23)
%I - 12 小时制的十进制小时数(范围从 00 到 12)
%j - 年份中的第几天,十进制数(范围从 001 到 366)
%m - 十进制月份(范围从 01 到 12)
%M - 十进制分钟数
%n - 换行符
%p - 根据给定的时间值为 `am' 或 `pm',或者当前区域设置中的相应字符串
%r - 用 a.m. 和 p.m. 符号的时间
%R - 24 小时符号的时间
%S - 十进制秒数
%t - 制表符
%T - 当前时间,和 %H:%M:%S 一样
%u - 星期几的十进制数表达 [1,7],1 表示星期一
%U - 本年的第几周,从第一周的第一个星期天作为第一天开始
%V - 本年第几周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第一个至少还有 4 天的星期,星期一作为每周的第一天。(用 %G 或者 %g 作为指定时间戳相应周数的年份组成。)
%W - 本年的第几周数,从第一周的第一个星期一作为第一天开始
%w - 星期中的第几天,星期天为 0
%x - 当前区域首选的时间表示法,不包括时间
%X - 当前区域首选的时间表示法,不包括日期
%y - 没有世纪数的十进制年份(范围从 00 到 99)
%Y - 包括世纪数的十进制年份
%Z 或 %z - 时区名或缩写
%% - 文字上的 `%' 字符
Example 1:
setlocale('LC_TIME','chs');
echo strftime('今天是 %A %B');
#返回:
时间是 星期一 九月 //在utf-8编码下会显示乱码
localtime(timestamp,is_associative)
返回本地时间(一个数组)。
参数:
timeestamp 是时间戳,如果没有给出则使用从 time() 返回的当前时间。
is_associative 如果设为 false 或未提供则返回的是普通的数字索引数组。如果该参数设为 true 则返回一个关联数组。
注释:
关联数组中不同的键名是:
"tm_sec" - 秒数
"tm_min" - 分钟数
"tm_hour" - 小时
"tm_mday" - 月份中的第几日
"tm_mon" - 年份中的第几个月,从 0 开始表示一月
"tm_year" - 年份,从 1900 开始
"tm_wday" - 星期中的第几天
"tm_yday" - 一年中的第几天
"tm_isdst" - 夏令时当前是否生效
strptime(date,format)
解析由 strftime() 生成的日期/时间
返回解析后的数组,出错则返回false
该函数可能被淘汰,在php5.2中无法使用
参数:
date 要解析的字符串
format date所使用的格式