世界分为24个时区,GMT是零时区,也就是通常所说的格林尼治时间。中国位于东八区,比GMT时间多八个小时。例如,GMT现在是2011-06-27 09:45:32,我们的时间就是2011-06-27 01:45:32。
PHP的mktime()函数返回的是GMT时间,date()函数返回的是依据date.timezone或者date_default_timezone_set()函数设置的时区对应的时间。
PHP大陆内地可用的时区是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐),港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北), 还有新加坡:Asia/Singapore。
PHP将时间戳转换成字符串可以使用gmdate()函数:
$s = gmdate('Y-m-d H:i:s', 1308279886);
PHP处理时间通常的做法是在MySQL数据库中用整数保存时间戳,在前端处理时增减对应的时区差量。
MySQL可以使用FROM_UNIXITME()将时间戳转换成datetime的类型,此函数会受到时区的影响:
SET SESSION time_zone = '+0:00';
SELECT updatetime, FROM_UNIXTIME(updatetime) FROM tbs_articles;
上面SQL返回的是GMT时间,因为时区被设置成了零时区:
1308279886 2011-06-17 03:04:46
如果将执行SET SESSION time_zone = '+8:00',返回的结果是:
1308279886 2011-06-17 11:04:46
MySQL可以使用DATE_FORMAT函数格式化datetime类型:
SET SESSION time_zone = '+0:00'; SELECT updatetime, FROM_UNIXTIME(updatetime), DATE_FORMAT(FROM_UNIXTIME(updatetime), '%Y-%m-%d %H:%i:%s') FROM tbs_articles; SELECT updatetime, FROM_UNIXTIME(updatetime), DATE_FORMAT(FROM_UNIXTIME(updatetime + 8 * 3600), '%Y-%m-%d %H:%i:%s') FROM tbs_articles;
参考:
1. 世界时区/时间http://app.travel.ifeng.com/tools/timezone-index-3.html
2. 世界时区图http://www.24-hotel.com.cn/w_hotel/world_time.asp
3. PHP所支持的时区列表http://php.net/manual/zh/timezones.php
4. MySQL日期和时间函数http://www.phpchina.com/resource/manual/mysql/functions.html#date-and-time-functions
5. PHP日期和格式http://cn.php.net/manual/zh/function.date.php