php日期时间函数

 

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所使用的格式



上一篇: PHP日期比较函数
下一篇: PHP date函数参数详解
文章来自: 网络转载
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: 2975
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑