TypeCodes

PHP中将Unix timestamp时间戳转换成北京时间

由于博客刚从wordpress转到typecho,所以对之前的数据库需要处理。在wordpress数据库中,文章和评论的时间记录形式和typecho不同:wordpress中登记的是北京时间,形如 2014-08-19 21:05:27;而typecho数据库中登记的是时间戳Unix timestamp,形如1408456593(对应标准北京时间是 2014/8/19 21:56:33 )。

于是,我在typecho中用date('Y-m-d H:i', $older_date)函数把从数据库读取出来的Unix timestamp格式的$older_date转换成形如 2014-08-19 21:05 的北京时间后,发现比当前的北京时间少了8个小时。GG一番,原来是时区导致的:格林威治时间与中国东八区本地时间相差8个时差。解决方法如下:

1 推荐的必杀技:修改php配置文件php.ini

先查看当前Linux系统的日期与时间(locale time)

[root@typecodes ~]# date
Tue Aug 19 21:36:33 CST 2014

然后修改php.ini文件的第 943 行处的 date.timezone( 设置时区 )

[root@typecodes ~]# vi /etc/php.ini
943 [Date]
944 ; Defines the default timezone used by the date functions
945 ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
946 date.timezone = Asia/Shanghai
###### Asia/Shanghai 还可以改成 PRCAsia/ChongqingAsia/Taipei等中国时区
2 使用PHP代码的解决方法

如果主机不能修改 php.ini 文件,那么只能使用临时办法解决了:先把 Unix timestamp 的值加 8 个小时(相当于 8 * 3600 = 28800 秒),再使用 date 函数格式化输出。例如,将上面的php代码date('Y-m-d H:i', $older_date)改成date('Y-m-d H:i', $older_date+28800)即可转换成标准的北京时间。

评论中 @mumuno 提供的PHP方法也是行的:

date_default_timezone_set("PRC");
date("Y-m-d H:i");
3 计算机时间概要

以下内容整理自互联网和 计算机世界中的时间概念 一文。

格林威治时间(Greenwich Mean Time, GMT)。

通用协调时间(Universal Time Coordinated, UTC)。UTC的表示方式为:年(y)、月(m)、日(d)、时(h)、分(min)、秒(s),均用数字表示。若以「世界标准时间」的角度来说,UTC比GMT来得更加精准: *UTC = GMT +/- 0.9* 。

本地时间(locale time):很显然,本地时间跟时区(timezone)有关: *本地时间 = UTC + 时区* 。例如,中国北京标准时间(忽略GMT和UTC的差异): *CST = GMT + 8 = UTC + 8* 。

Unix时间戳(Unix timestamp),又称 Unix时间(Unix time) 或 POSIX时间(POSIX time) ,它从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
打赏支持

Comments »