摘要訊息 : 學習 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. 如若閣下需要轉發, 在已經授權的情況下請註明本文出處 :