摘要訊息 : 學習 PHP 中的時間和日期表示方法.
0. 前言
在讲时间与日期之前, 需要设置好 PHP 的配置文件 php.ini 里的 date.timezone= 选项. 否则, 一些关于时间的函数将不会生效. 如果你是按照本博客给出的方式安装 PHP 的话, 可以无视. 如果不想在配置文件里设置的话, 可以通过 date_default_timezone_set() 函数设置.
本文于 2022 年 3 月 18 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.
1. UNIX 时间戳
在 UNIX 和 UNIX-like 系统中, 时间都是通过时间戳的方式进行存储的. 时间戳就是现在距离 GMT (1970 年 1月 1 日 零点整) 的时间差, 单位为秒. 它是一个整数, 而且不可改变
PHP 完全采用了 UNIX 时间戳, 在 PHP 中可以通过 time() 函数获取时间戳 :
<?php
$time = time();
?>
2. 获取时间日期信息
PHP 中提供了 date 函数使得时间戳可以转换为能看得懂的通用时间. 除此之外, 还提供了 getdate 函数, 不过这个函数返回的是一个关于时间的数组. date 函数中, 有一个 formate 参数, 下面给出这个参数的具体值和对应的含义 :
d: 一个月中的第几天 (从 01 到 31);D: 星期几的文本表示 (用三个字母表示);j: 一个月中的第几天, 不带前导零 (1 到 31);l: 星期几的完整的文本表示;N: 星期几的 ISO-8601 数字格式表示 (1 表示 Monday[星期一], 7 表示 Sunday[星期日]);S: 一个月中的第几天的英语序数后缀 (2 个字符 : st、nd、rd 或 th. 与 j 搭配使用);w: 星期几的数字表示 (0 表示 Sunday[星期日], 6 表示 Saturday[星期六]);z: 一年中的第几天 (从 0 到 365);W: 用 ISO-8601 数字格式表示一年中的星期数字 (每周从 Monday[星期一] 开始);F: 月份的完整的文本表示 (January[一月份] 到 December[十二月份]);m: 月份的数字表示 (从 01 到 12);M: 月份的短文本表示 (用三个字母表示);n: 月份的数字表示, 不带前导零 (1 到 12);t: 给定月份中包含的天数;L: 是否是闰年 (如果是闰年则为 1, 否则为 0);o: ISO-8601 标准下的年份数字;Y: 年份的四位数表示;y: 年份的两位数表示;a: 小写形式表示 : am 或 pm;A: 大写形式表示 : AM 或 PM;B: Swatch Internet Time (000 到 999);g: 12 小时制, 不带前导零 (1 到 12);G: 24 小时制, 不带前导零 (0 到 23);h: 12 小时制, 带前导零 (01 到 12);H: 24 小时制, 带前导零 (00 到 23);i: 分,带前导零 (00 到 59);s: 秒,带前导零 (00 到 59);u: 微秒;e: 时区标识符 (例如 : UTC、GMT、Atlantic/Azores);I: 日期是否是在夏令时 (如果是夏令时则为 1, 否则为 0);O: 格林威治时间 (GMT)的差值,单位是小时 (实例 : +0100);P: 格林威治时间 (GMT)的差值,单位是 hours:minutes;T: 时区的简写 (实例 : EST, MDT)Z: 以秒为单位的时区偏移量. UTC 以西时区的偏移量为负数 (-43200 到 50400);c: ISO-8601 标准的日期 (例如 2013-05-05T16:34:42+00:00);r: RFC 2822 格式的日期 (例如 Fri, 12 Apr 2013 12:01:05 +0200);U: 自 Unix 纪元 (January 1 1970 00:00:00 GMT)以来经过的秒数.
<?php
echo date("Y"); // 结果 : 輸出目前的年份
?>
getdate 函数同样也可以返回一些时间信息, 它对比 date 函数, 更能让人明白. 因为这是一个关联数组. 接下来给出数组如何访问 :
[seconds]: 秒;[minutes]: 分;[hours]: 小时;[mday]: 一个月中的第几天;[wday]: 一周中的某天;[mon]: 月;[year]: 年;[yday]: 一年中的某天;[weekday]: 星期几的名称;[month]: 月份的名称;[0]: 自 Unix 纪元以来经过的秒数.
访问的时候, 可以对里面的索引加引号, 也可以不加.
3. 时间检验
PHP 提供 checkdate 函数来对时间进行检验, 如果没有这个函数, 就要自己写 switch 语句进行检验了. 自己写函数检验非常麻烦. checkdate 函数可以检验日期的有效性, 例如 2 月 31 日到底合不合法 : checkdate($month, $date, $year);.
4. 输出格式化时间戳的日期和时间
PHP 提供了 strftime 函数来讲时间戳格式化为日期, 这个有点类似于 C 中的 sprinf 函数 : strftime($format, $time);. 现在给出 $format 的具体格式 :
%a: 星期几名称的简写;%A: 星期几名称的全称;%b: 月份名称的简写;%B: 月份名称的全称;%c: 首选的日期和时间表示法;%C: 表示世纪的数字 (年份除以 100, 范围从 00 到 99);%d: 一个月中的第几天 (01 到 31);%D: 时间格式, 与 %m/%d/%y 表示法相同;%e: 一个月中的第几天 (1 到 31);%g: 与 %G 表示法类似,但不带世纪;%G: 与 ISO 星期数对应的 4 位数年份 (见 %V);%h: 与 %b 表示法相同;%H: 小时, 使用 24 小时制 (00 到 23);%I: 小时, 使用 12 小时制 (01 到 12);%j: 一年中的第几天 (001 到 366);%m: 月份 (01 到 12);%M: 分;%n: 换行符;%p: 与给定的时间值相对应的 am 或 pm;%r: a.m. 和 p.m. 的时间标记法;%R: 24 小时制的时间标记法;%S: 秒;%t: tab 制表符;%T: 当前时间,与 %H:%M:%S 表示法相同;%u: 星期几的数字表示 (1 到 7), Monday[星期一] = 1. 警告 : 在 Sun Solaris 系统中, Sunday[星期日] = 1;%U: 当年包含的周数,从第一个星期日开始,作为第一周的第一天;%V: 当年包含的 ISO 8601 格式下的周数 (01 到 53), week 1 表示当年的第一周, 至少要有四天, 且以星期一作为周的第一天;%W: 当年包含的周数,从第一个星期一开始,作为第一周的第一天;%w: 以十进制数形式表示一周中的某天, Sunday[星期日] = 0;%x: 首选的日期表示法, 不带时间;%X: 首选的时间表示法, 不带日期;%y: 不包含表示世纪的数字的年份表示 (范围从 00 到 99);%Y: 包含表示世纪的数字的年份表示;%Z或%z: 时区名称或简写;%%: 输出一个 % 字符.
$time 参数是 UNIX 时间戳.
5. 时间戳转换
PHP 提供 mktime 函数, 可以将给定的时间转换为时间戳 : mktime($hour, $minute, $second, $month, $date, $year);.
自創文章, 原著 : Jonny. 如若閣下需要轉發, 在已經授權的情況下請註明本文出處 :