8.3.4 时间日期函数
8.3.4.1 时间日期函数概述
时间日期函数用来获取服务器的时间和日期,或对时间日期类型的数据进行各种处理,来满足程序的需要。在编程中时常要用到时间日期,如信息发布时记录发布的时间,用户注册时要记录注册的时间,记录用户进行某些操作的时间等。PHP 5提供的时间日期函数如表8-3所示:
通过表8-3可以看到,PHP提供了很多函数实现各种时间/日期操作。其中不乏很有趣的函数,如返回某给定日期与地点的日出/日落时间。不过其中部分函数并没有很大的实用价值,只需要熟练掌握其中几个函数的使用,即可实现绝大多数常见的应用。
8.3.4.2 获取当前时间的Unix时间戳
很多读者可能不明白什么是Unix时间戳。Unix时间戳是指从Unix纪元(格林威治时间1970年1月1日00时00分00秒)开始到当前时间为止相隔的秒数。因此很显然Unix时间戳应该代表一个很大的整数。Unix时间戳在很多时候非常有用,尤其在对时间进行加减时作用最为明显。如当前时间是“2006年10月10日10点10分10秒”,在这个时间基础上加上25天8小时55分58秒,会得到一个什么时间呢?可能推算起来比较复杂。因为除了时间进位以外,还涉及到不同月份天数可能不同(可能是28天、29天、30天、31天)。所以用数学方法直接加减是不行的。如果使用Unix时间戳,在第一个时间的基础上加上一定的秒数,得到的就是第二个时间的Unix时间戳。然后用PHP的有关函数把这个时间戳转换成普通时间格式显示即可。
PHP中提供了time()函数来直接获取当前时间的Unix时间戳。
1: <!--文件8-17.php:获取Unix时间戳-->
2: <HTML>
3: <HEAD>
4: <TITLE>获取Unix时间戳</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $tm= time();
9: echo "当前时间的Unix时间戳为:".$tm;
10: ?>
11: </BODY>
12: </HTML>
本程序运行结果如图8-15所示。
图8-15 程序8-17.php的运行结果
图中的数字1206419093表示的是从1970年1月1日0点0分0秒到本程序执行时相隔的秒数。如果每隔一段时间刷新一下页面,会发现时间戳的值每次都会变化。因为每过一秒钟,这个数字就增加1。每次刷新页面都会重新调用程序,都会获得一个不同的时间,因此Unix时间戳在不断变化。具体的说,这个数字在不断增大。
8.3.4.3 获取指定时间的Unix时间戳
能不能获得一个指定时间的Unix时间戳呢?也就是说要获得的时间戳不是当前时间的,而是一个固定时间的。PHP给提供了mktime()函数和strtotime()函数来完成这个操作。
mktime()函数的格式如下:
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year]]]]]] )
本函数的作用是根据给出的参数返回Unix时间戳。6个参数全都是整数,分别代表小时、分钟、秒、月、日、年。参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。当全部参数都被省略时,获得的就是当前时间的Unix时间戳。
另外strtotime()函数允许使用一个时间字符串作为参数来获取Unix时间戳。这个时间串的顺序与中文习惯较为吻合。如“2000-11-12 10:34:55”表示2000年11月12日10时34分55秒。该字符串指代了一个具体的时间,可以作为strtotime()函数的参数,来获得这个时间的Unix时间戳。
1: <!--文件8-18.php:获取指定时间的Unix时间戳-->
2: <HTML>
3: <HEAD>
4: <TITLE>获取指定时间的Unix时间戳</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //用mktime()返回时间戳
9: $tm= mktime(23,56,59,12,20,1999);
10: echo "1999年12月20日23点56分59秒的Unix时间戳为:".$tm;
11: //用strtotime()返回时间戳
12: $tm2= strtotime("1999-12-20 23:56:59");
13: echo "<br>用strtotime获得的同一时间的时间戳:".$tm2;
14: ?>
15: </BODY>
16: </HTML>
本程序运行结果如图8-16所示。
图8-16 程序8-18.php的运行结果
程序8-18.php用mktime函数将一个指定时间格式化为Unix时间戳。然后用strtotime函数同样格式化这个时间,不过用一个字符串而不是6个数字作为参数。运行结果显示两个函数的返回结果完全相同。刷新页面时,时间戳值都不会发生变化。因为这个时间戳是一个固定的时间,不会随当前时间变化而变化。
有的读者可能会问一个问题:如果我使用mktime函数时提供的参数不符合常规,会出现什么情况呢?比如每年最多有12个月,不可能有14月,如果给月份这个参数提供一个14,会怎样呢?实际上,PHP会把某年的14月作为下一年的2月。如1999年14月会被认为是2000年2月。同理如果时间设置为23分70秒,那PHP会作为24分10秒来处理。读者可以自行编制程序进行测试。
8.3.4.4 取得时间日期信息
前面学习了如何获得一个时间的Unix时间戳。虽然用Unix时间戳有利于在计算机中进行时间的计算,但是在显示时间时还是应该显示成通用的“年月日时分秒”以及星期几等格式,而不是直接输出一个Unix时间戳。PHP中提供了date()和getdate()等函数来实现从Unix时间戳到通用时间日期的转换。
1.getdate()函数
getdate()函数用来将一个Unix时间戳格式化成具体的时间日期信息,其使用格式如下:
array getdate ( [int timestamp] )
其中参数timestamp就是一个Unix时间戳。如果不指定参数,则默认使用当前时间。该函数返回一个数组,数组中存放了详细的时间信息。通过数组下标可以取得数组中的元素值。其下标与值得对应关系如表8-4所示。
下面我们看一个例子,来全面展示该函数的强大功能。
1: <!--文件8-19.php:getdate()函数获取详细的时间信息-->
2: <HTML>
3: <HEAD>
4: <TITLE>getdate()函数获取详细的时间信息</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //首先假设一个时间
9: $dt= "2007-07-01 08:30:00";
10: echo "时间:".$dt."<br>";
11: //将此时间格式化为Unix时间戳
12: $tm= strtotime($dt);
13: echo "此时间的Unix时间戳:".$tm."<br>";
14: //获取该时间的详细信息
15: $arr = getdate($tm);
16: //输出详细信息
17: echo "秒:".$arr["seconds"]."<br>";
18: echo "分:".$arr["minutes"]."<br>";
19: echo "时:".$arr["hours"]."<br>";
20: echo "日:".$arr["mday"]."<br>";
21: echo "月:".$arr["mon"]."/".$arr["month"]."<br>";
22: echo "年:".$arr["year"]."<br>";
23: echo "星期:".$arr["wday"]."/".$arr["weekday"]."<br>";
24: echo "该日期是该年中的第".$arr["yday"]."天<br>";
25: ?>
26: </BODY>
27: </HTML>
本程序中,第9行设置了一个时间,第12行将此时间格式化成UNIX时间戳。第15行将此时间戳用getdate()函数获取详细时间信息。然后在第17~24行分别输出了全部的时间信息。程序的输出结果如图8-17所示。
图8-17 程序8-19.php的运行结果
本程序中假定日期为“2007-07-01 08:30:00”,实际上可以直接用语句“$arr = getdate();”来获得当前时间的详细信息。这时输出的时间信息就是当前程序执行时的时间信息。感兴趣的读者可以自行测试。
2.date()函数
date()函数用来将一个Unix时间戳格式化成指定的时间/日期格式。getdate()函数可以获取详细的时间信息,但是很多时候并不是要取得如此具体的时间信息,而是将一个Unix时间戳所代表的时间按照某种容易识读的格式输出。这就需要用到date()函数。该函数的使用格式是:
string date ( string format [, int timestamp] )
该函数直接返回一个字符串。这个字符串就是一个指定格式的日期时间。参数format是一个字符串,用来指定输出的时间的格式。可选参数timestamp是要处理的时间的Unix时间戳。如果参数为空,那么默认值为当前时间的Unix时间戳。
本函数的重点是学习如何使用format参数。format参数必须由指定的字符构成,不同的字符代表不同的特殊含义,如表8-5所示。
表8-5中列出了绝大部分format参数字符,个别极为不常用的没有列出。通过表8-5已经看出format字符数量众多,涉及方方面面。date()函数可以完成的功能极为丰富。
下面我们通过一个例子来看这些format字符如何使用。
1: <!--文件8-20.php:用格式化字符串输出时间信息-->
2: <HTML>
3: <HEAD>
4: <TITLE>用格式化字符串输出时间信息</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //设置一个时间(如采用当前时间可用time())
9: $tm = strtotime("2008-09-09 10:30:40");
10: echo "初始化设置的时间为:2008-09-09 10:30:40<br>";
11: //使用不同的格式化字符串测试输出效果
12: echo date("Y-M-D H:I:S A",$tm)."<br>";
13: echo date("y-m-d h:i:s a",$tm)."<br>";
14: echo date("Y年m月d日[l] H点i分s秒",$tm)."<br>";
15: echo date("F,d,Y l",$tm)."<br>";
16: echo date("Y-M-D H:I:S",$tm)."<br>";
17: echo date("Y-M-D H:I:S",$tm)."<br>";
18: echo date("所在时区:T,与格林威治时间相差:O小时",$tm)."<br>";
19: //输出详细信息
20: ?>
21: </BODY>
22: </HTML>
本程序的运行结果如图8-18所示。
图8-18 程序8-20.php的运行结果
通过程序8-20.php可以看出,格式化字符串的使用非常灵活。只要在字符串中包含相关字符,date函数就能把这些字符替换成指定的时间日期信息。可以利用这个函数随意输出需要的时间日期格式。
程序的最后一条输出用的是格式字符“T”和“O”来输出运行本程序的服务器所处的时区以及本时区和格林威治标准时间相差的小时数。程序输出时区为UTC,相差时间为0小时。这虽然与世界标准时区和时间相符,但是并不是本地的时间。如北京时间要比格林威治时间晚8个小时,因此在取得的本地时间基础上再增加8个小时才是北京时间。增加8个小时的方法很简单,在已经取得的当前时间的Unix时间戳上加8*60*60即是8小时之后的时间戳。如果读者在编写程序时发现程序获得的时间与北京时间不符,应该考虑是否是时区问题,对取得的时间进行相应处理即可。
PHP的时间日期函数很常用,但并不复杂。读者一般只需要掌握Unix时间戳的获得和操作方法和格式化字符的使用方法,即可轻松掌握PHP时间日期的处理。
老师做这些很辛苦,而我们从老师的辛苦中学到了不少
老师讲解详细,需要好好学习
老师讲的很详细,从中学到很多。