PHP提供了大量的内置函数,使开发人员在时间的处理上游刃有余,大大提高了工作效率。介绍一些常见的PHP日期和时间函数以及日期和时间的处理。
常用的日期和时间处理函数
函 数  | 说 明  | 
checkdate  | 验证时间函数,判断时间是否有效,有效返回true,否则返回false  | 
date_default_timezone_get  | 取得脚本日期时间函数所使用的默认时区  | 
date_default_timezone_set  | 设定日期时间函数的默认时区  | 
date  | 格式化一个本地时间/日期  | 
getdate  | 获取日期/时间信息  | 
gettimeofday  | 获取当前时间  | 
localtime  | 获取本地时间  | 
microtime  | 返回当前时间戳和微秒数  | 
mktime  | 取得一个UNIX时间戳  | 
strtotime  | 将任何英文文本的日期时间描述解析为UNIX时间戳  | 
time  | 返回当前的UNIX时间戳  | 
系统时区设置
      在学习过程中发现通过date()函数获取到的时间跟本地时间不一样,这是由于PHP5对date()函数进行了重写,因此,目前的日期时间函数比系统时间少8个小时。在PHP语言中默认设置的是标准的格林威治时间(即采用的是零时区)。更改PHP语言中的时区设置主要有以下两种方法:
       1. 修改php.ini文件中的设置,找到[date]下的;date.timezone = 选项,将该项修改为date.timezone=Asia/Hong_Kong,然后重新启动apache服务器。
       2. 在应用程序中,使用时间日期函数之前添加如下函数:
      date_default_timezone_set(“Asia/Hong_Kong”);设置完成后,date()函数就可以正常使用了,不会再出现时差问题。
UNIX时间戳
时间戳是文件属性中的创建、修改、访问时间。数字时间戳服务(digital time stamp service, DTS)是web网站安全服务项目之一,能提供电子文件的日期和时间信息的安全保护。
      时间戳是一个经加密后形成后的凭证文档,它包括3个部分:
       ²  需要添加时间戳的文件用Hash编码加密形成摘要。
       ²  DTS接受文件的日期和时间信息。
       ²  对接受的DTS文件加密。
       数字时间是由认证单位DTS来添加的,以DTS接收到文件的时间为依据。时间戳的作用原理是通过其他加密法将时间的数值转换为加密的数值,时间变化后加密的数值也随之变化。时间戳的优点是:变化的加密数值来防止数值被窃取后非法重复利用,也就起到了加密的作用。时间戳主要依赖于时间,在约定的一段时间内产生唯一的一个数值。
mktime()函数
      语法:
       int mktime(int hour, int minute, int month, int day, int year, int [is_dst])
参 数  | 说 明  | 
hour  | 小时数  | 
minute  | 分钟数  | 
second  | 秒数(一分钟之内)  | 
month  | 月份数  | 
day  | 天数  | 
year  | 年份数  | 
is_dst  | 参数is_dst在夏令时可以被设置为1,如果不是则设置为0;如果不确定是否为夏令时则设置为-1(默认值)  | 
       注意:有效的时间戳典型范围是格林尼治时间1901年12月13日20:45:54~2038年1月19日03:13:07(此范围符合32位有符号整数的最小值和最大值)。在Windows系统中此范围限制为从1970年1月1日~2038年1月19日。
date()函数
      date(string format,int timestamp)
       该函数将返回参数timestamp按照指定格式而产生的字符串。其中参数timestamp是可选的,如果省略,则使用当前时间。format参数可以使开发人员按其指定的格式输出时间日期。
       date_default_timezone_set(PRC);  //设置北京时间.
  | 说明  | 返回值例子  | 
日  | ---  | ---  | 
d  | 月份中的第几天,有前导零的 2 位数字  | 01 到 31  | 
D  | 星期中的第几天,文本表示,3 个字母  | Mon 到 Sun  | 
j  | 月份中的第几天,没有前导零  | 1 到 31  | 
l("L"的小写字母)  | 星期几,完整的文本格式  | Sunday 到 Saturday  | 
N  | ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)  | 1(表示星期一)到 7(表示星期天)  | 
S  | 每月天数后面的英文后缀,2 个字符  | st,nd,rd 或者 th。可以和 j 一起用  | 
w  | 星期中的第几天,数字表示  | 0(表示星期天)到 6(表示星期六)  | 
z  | 年份中的第几天  | 0 到 365  | 
星期  | ---  | ---  | 
W  | ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)  | 例如: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)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)  | Examples: 1999 or 2003  | 
Y  | 4 位数字完整表示的年份  | 例如:1999 或 2003  | 
y  | 2 位数字表示的年份  | 例如:99 或 03  | 
时间  | ---  | ---  | 
a  | 小写的上午和下午值  | am 或 pm  | 
A  | 大写的上午和下午值  | AM 或 PM  | 
B  | Swatch Internet 标准时  | 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  | 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format()  | 示例: 654321  | 
时区  | ---  | ---  | 
e  | 时区标识(PHP 5.1.0 新加)  | 例如:UTC,GMT,Atlantic/Azores  | 
I  | 是否为夏令时  | 如果是夏令时为 1,否则为 0  | 
O  | 与格林威治时间相差的小时数  | 例如:+0200  | 
P  | 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加)  | 例如:+02:00  | 
T  | 本机所在的时区  | 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。  | 
Z  | 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。  | -43200 到 43200  | 
完整的日期/时间  | ---  | ---  | 
c  | ISO 8601 格式的日期(PHP 5 新加)  | 2004-02-12T15:19:21+00:00  | 
r  | RFC 822 格式的日期  | 例如:Thu, 21 Dec 2000 16:01:07 +0200  | 
U  | 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数  | 参见 time()  | 
getdate()函数
该函数返回数组形式的日期时间信息,如果没有时间戳,则以当前时间为准。
元 素  | 说 明  | 
seconds  | 秒,返回值0~59  | 
minutes  | 分钟,返回值为0~59  | 
hours  | 小时,返回值为0~23  | 
mday  | 月份中第几天,返回值为1~31  | 
wday  | 星期中第几天,返回值为0(星期天)~6(星期六)  | 
mon  | 月份数字,返回值为1~12  | 
year  | 4位数字表示的完整年份,返回值加2000或2008  | 
yday  | 一年中第几天,返回值0~365  | 
weekday  | 星期几的完整文本表示,返回值为Sunday~Saturday  | 
month  | 月份的完整文本表示,返回值为January~December  | 
0  | 返回从UNIX纪元开始的秒数  | 
比较两个时间的大小
      在实际开发中经常遇到判断两个时间的大小,PHP中的时间是不可以直接来进行比较的。所以,首先要将时间输出为时间戳的格式,然后再进行比较,这是常用到的方法。
       有两个函数都可以实现这个功能,这里使用strtotime()函数,该函数可以将任何英文文本的日期时间描述解析为UNIX时间戳。       该函数的语法为:
       int strtotime(string time, int now)
       该函数有两个参数。如果参数time的格式是绝对时间,则now参数不起作用;如果参数time的格式是相对时间,那么其对应的时间就是参数now来提供的,如果没有提供参数now,对应的时间就是当前时间。如果解析失败,则返回-1.
计算页面脚本的运行时间
microtime()函数,该函数返回当前UNIX时间戳和微秒数。返回格式为msec sec的字符串,其中sec是当前的UNIX时间戳,msec为微秒数。该函数的格式为:
       string microtime(void)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<?php
// 设置时区
date_default_timezone_set('Asia/Chongqing');
// 指定时间到UNIX纪元的差值
echo mktime(1, 2, 3, 4, 5, 2006)."<br>";
// 当前时间到UNIX纪元的差值
echo time()."<br>";
// 格式化时间
echo date("Y-m-d H-i-s")."<br>";
// 时间数组
$arrays = getdate();
print_r($arrays)."<br>";
// 检测时间
var_dump( checkdate(7, 9, 2015) );
"<br>";
// 本地化时间戳,strtotime还可用于时间的大小比较
setlocale(LC_TIME, 0);
echo strftime('%Y,%m,%d', strtotime('2000-04-00'))."<br>";
// 微妙
echo microtime(true);
function run_time()
{
list($msec, $sec) = explode(" ", microtime());
return ((float)$msec + (float)$sec);
}
$start_time = run_time();
$time1 = strtotime(date( "Y-m-d H:i:s"));
$time2 = strtotime("2008-2-3 17:10:00");
$time3 = strtotime("2008-8-8");
$sub1 = ceil(($time2 - $time1) / 3600); //60 * 60
$sub2 = ceil(($time3 - $time1) / 86400); //60 * 60 * 24
echo "离放假还有<font color=red> $sub1 </font>小时!!!" ;
echo "<p>";
echo "离北京奥运开幕还有<font color=red>$sub2 </font>天!!!";
$end_time = run_time();
echo '耗时'.($end_time - $start_time);
?>
</body>
</html>











