PHP中日期和时间相关函数简介
一、UNIX时间戳
在当前大多数的UNIX系统中,保存当前日期和时间的方法是:保存格林尼治标准时间从1970年1月1日零点起到当前时刻的秒数,以32为整列表示。1970年1月1日零点也称为UNIX纪元。在Windows系统下也可以使用UNIX时间戳,简称时间戳,但如果时间在1970年以前或2038年以后,处理的时候可能会出现问题。
PHP在处理有些数据,特别是对数据库中时间类型的数据进行格式化时,经常需要先将时间类型的数据转化为UNIX时间戳再进行处理,另外,不同的数据库系统对时间类型的数据不能兼容转换,这时就需要将时间转化为UNIX时间戳,再对时间戳进行操作,这样就实现了不同数据库系统的跨平台性。
二、时间转化为时间戳
将用字符串表达的日期和时间转化为时间戳的形式,可以使用strtotime()函数。
int strtotime(string $time[,int $now])
$time是包含英语日期格式的字符串,$time值如果有毫秒数将被忽略。其值相对于$now参数给出的时间,如果没有给出则默认使用系统当前时间。
如果给定的年份是两位数字的形式,则年份值0~69表示2000~2069,70~100表示1970~2000.
另一个取得日期的UNIX时间戳的函数是mktime()函数,语法如下:
int mktime([int,$hour[,int $minute[,int $second[,$int $month[,int $day[,int $year]]]]]])
如果所有参数都为空,则默认为当前时间。
三、获取日期和时间
1.date()函数
date()函数的作用是将时间戳按照给定的格式转化为具体的日期和时间字符串。
string date(string $format[,int $timestamp])
说明:$format指定了转化后的日期和时间的格式,$timestamp是需要转化的时间戳,如果省略则使用本地当前时间,即默认值为time()函数的值。time()函数返回当前时间的时间戳。
date()函数指出的格式代码
字符 | 说明 | 返回值例子 |
d | 月份中的第几天 | 01~31 |
D | 星期中的第几天 | Mon到Sun |
j | 月份中的第几天,没有前导零 | 1~31 |
I | 星期几,完整的文本格式 | Sunday~Saturday |
N | ISO-8601格式数字表示的星期中的第几天 | 1(星期一)~7(星期天) |
S | 每月天数后面的英文后缀,用2个字符表示 | st、nd、rd或th,可以和j一起用 |
w | 星期中的第几天,数字表示 | 0(星期天)~6(星期六) |
z | 年份中的第几天 | 0~366 |
W | ISO-8601格式年份中的第几周,每周从星期一开始 | 例如: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)属于前一年或下一年,则用那一年 | 例如:1999或2003 |
Y | 4为数字完整表示的年份 | 例如:1999或2003 |
y | 2位数字表示的年份 | 例如:99和93 |
a | 小写的上午和下午值 | am和pm |
A | 大写的上午和下午值 | AM和PM |
B | Swatch Internet标准时 | 000-999 |
g | 小时,12小时格式,没有前导零 | 1~12 |
G | 小时,24小时格式,没有前导零 | 0~24 |
h | 小时,12小时格式,有前导零 | 01~12 |
H | 小时,24小时格式,有前导零 | 00~23 |
i | 有前导零的分钟数 | 00~59 |
s | 秒数,有前导零 | 00~59 |
e | 时区标志 | 例如:UTC、GMT |
I | 是否为夏令时 | 如果是夏令时为1,否则为0 |
O | 与格林尼治时间相差的小时数 | 例如:+0200 |
P | 与格林尼治时间(GMT)的差别,小时和分钟之间用冒号分割 | 例如:+02:00 |
T | 本机所在的时区 | 例如:EST、MDT |
Z | 时区偏移量的秒数。UTC西边的时区偏移量总是负的,UTC东区的时区偏移量总是正的 | -43200~43200 |
c | ISO8601格式的日期 | 2004-02-12T15:19:21+00:00 |
r | RFC822格式的日期 | Thu,21,Dec2000 16:01:07 +0200 |
U | 从UNIX纪元开始至今的秒数 | time()函数 |
2.getdate()函数
使用getdate()函数也可以获取日期和时间信息。
array getdate([int ,$timestamp])
说明:$timestamp是要转化的时间戳,如果不给出则使用当前时间。函数根据$timestamp返回一个包含日期和时间信息的数组。
getdate()函数返回的数组中的键名和值
键名 | 说明 | 举例 |
seconds | 秒的数字表示 | 0~59 |
minutes | 分钟的数字表示 | 0~59 |
hours | 小时的数字表示 | 0~23 |
mday | 月份中第几天的数字表示 | 1~31 |
wday | 星期中第几天的数字表示 | 0(表示星期天)~6(表示星期六) |
mon | 月份的数字表示 | 1~12 |
year | 4位数字表示的完整年份 | 例如:1993或2003 |
yday | 一年中第几天的数字表示 | 0~365 |
weekday | 星期几的完整文本表示 | Sunday~Saturday |
month | 月份的完整文本表示 | January~December |
0 | 自UNIX纪元开始至今的秒数 | 系统相关,典型值从-2147483648~2147483647 |
四、其他日期和时间函数
1.日期和时间的计算
由于时间戳是32位整型数据,所以通过对时间戳进行加减法运算可计算两个时间的差值。
2.检查日期
checkdate()函数可以用于检查一个日期数据是否有效,语法如下:
bool checkdate(int $month,int $day,int $year)
说明:$year的值是从1到32767,$month的值从1到12,$day的值在给定的$month值所具有的天数范围内,其中闰年的情况也考虑在内。当给定的日期是有效的日期时,函数返回TRUE,否则返回FALSE,
3.设置时区
系统默认的是格林尼治标准时间,所以显示当前时间可能与本地时间会有差别,PHP中提供了可以修改时区的函数date_default_timezone_set().
bool date_default_timezone_set(string $timezone_identifier)
参数$timezone_identifier为要指定的时区,中国大陆可用的值是Asia/Chongqing,Asia/Shanghai,Asia/Urumqi。北京时间可以使用PRC。
另外,还可以通过修改PHP配置文件的方法修改默认时区:打开php.ini,找到date_timezone选项,将选项前面的分号“;”去掉,将选项的值设为要设置的默认时区的时区标志符。保存后重启Apache,系统默认的时区就设置完了。