每日归档: 2009年5月13日

PHP中的时间时区运算

我在测试twitter的API时,在它返回的用户信息里,关于用户时区的信息有两个

<utc_offset>28800</utc_offset>
<time_zone>Beijing</time_zone>

我希望利用这两个数值,得到用户的的DateTimeZone,直接new DateTimeZone(‘Beijing’)是不行的,我看了PHP的API,时区里是没有“Beijing”的,中国的时区应该是“Asia/Shanghai”,看来这个“Beijing”只是用来显示的,我又查了DateTimeZone的API,里面也没有根据UTC Offset值取得DateTimeZone的方法,看来不能通过这样的方法来做了。

utc_offset这个值是应该表示与UTC标准时间相差的秒数,测试下面的代码

$datetimezone = new DateTimeZone(‘Asia/Shanghai’);
$datetime = new DateTime(“now”,$datetimezone);
echo $datetime->getOffset();

结果显示28800,没错,时区“Asia/Shanghai”与UTC的时间差是28800秒,也就是8个小时(我们在东8区)。

在PHP中使用time()或是DateTime对象,在不指定DateTimeZone时,其默认的DateTimeZone就是UTC,产生的时间就是UTC时间,把这个时间加上Offset值之后,就可以显示出本时区的正确时间了,比如下面的代码

$datetime = time();
echo date(“y-m-d H:i:s”,$datetime);
echo “<br/>”;
$datetime = $datetime + 28800;
echo date(“y-m-d H:i:s”,$datetime);

输入的结果是
09-05-13 04:21:44
09-05-13 12:21:44

上面是UTC的时间,而下面的是北京时间。

在我们设计数据的时候,时间字段设计为长整数字段比较方便,存放UTC的time()的Unix时间戳,用户可以自己定义所在的时区,通过Offset,最终显示给用户其时区的时间。我感觉Java里的TimeZone似乎要更灵活一些,可以这样TimeZone.getTimeZone(“GMT+08:00”)

另外:在PHP里取得所有可用时区的方法是DateTimeZone::listIdentifiers()。