在讲时间与日期之前, 需要设置好 PHP 的配置文件 php.ini 里的 date.timezone= 选项. 否则, 一些关于时间的函数将不会生效. 如果你是按照本博客给出的方式安装 PHP 的话, 可以无视

如果不想在配置文件里设置的话, 可以通过 date_default_timezone_set() 函数设置

博主喜欢设置为 "Asia/Hong_Kong", 当然也可以设置为 PRC

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);