摘要訊息 : 學習 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);.