有关 PHP 和 MySQL 时区的一点总结

 更新时间:2008年03月26日 22:08:31   作者:  
由于暂时使用国外的空间,在我发布 Blog 的时候发现时间总是不对。依据我以前编写程序的经验,这是时区的问题。这个问题解决起来并不难,写下我的解决途径以便日后参考。
PHP 脚本端的市区设置可以在 php.ini 下设置 date.timezone 键的值为 'Asia/Shanghai' 即可。但是通常共享虚拟主机本身没有修改 php.ini 权限。这个时候就应该在程序公共部分加入

ini_set('date.timezone','Asia/Shanghai');动态修改 php.ini 的设置。之后可以测试一下时间是否正确:

var_dump(date());如果服务器的本地时间是正确的,那么一般就能解决问题了。附,PHP 5.1 以上提供了专门的函数修改对应的时区:

date_default_timezone_set('Asia/Shanghai');建议使用此函数,因为更通用一些。对应 'Asia/Shanghai' 其他可以使用的大陆时区还有:Asia/Chongqing 、Asia/Shanghai 、Asia/Urumqi (依次为重庆,上海,乌鲁木齐);港台地区可用:Asia/Macao、Asia/Hong_Kong、Asia/Taipei(依次为澳门,香港,台北);还有新加坡:Asia/Singapore;其他可用的值是:Etc/GMT-8、Singapore、Hongkong、PRC;老外好像把北京漏调了。

但是,在我修改成功 PHP 端的时区以后发现日期并没有正确的记录下来。这个时候我考虑是否是数据库的问题。果不其然,因为程序插入的函数并没有调用 PHP 的时间,而是直接使用 MySQL 的 CURRECT_TIMESTAMP。这个时候就要考虑是否能修改 MySQL 方面的时区。

参考了 MySQL 的文档,发现一个可行的 SQL 语句为:

SET GLOBAL time_zone = '+8:00'; 其中 '+8:00' 是东八区的表示方法,其他的市区依次类推。而我在数据库模型中插入改语句发现权限不够(该死的虚拟主机提供商)。接下来我调试了很多语句,比如:

DATE_ADD(UTC_TIMESTAMP(), INTERVAL 8 HOUR);显示时区的 SQL 语句:

SHOW VARIABLES LIKE 'system_time_zone'等等。而由于 MySQL 权限的限制并没有彻底的解决方案。我 Google 了下,发现老外这个有一个非常好的解决方案。但是他需要修改每条插入数据的 SQL 语句。这样的方案并不是非常的有效,一旦数据库时区改成正常,那么相应的 SQL 语句又要改回来。

而我考虑既然 PHP 端已经可以正确的解决时间的问题了。MySQL 数据库方面虽然可以使用相应的函数解决,但是如果日后迁移到别的主机环境又要改回来。而相应的字段是一个 TIMESTAMP 类型的,默认的值为 CURRECT_TIMESTAMP,当然是可以指定时间的。

那么我的做法就是让 PHP 插入当前正确的时间,这样虽然程序方面需要做相应的修改。不过日后配置修改起来只要修改一处就可以了。最后插入数据库的时间注意一下格式:

date('Y-m-d H:i:s')这样就可以解决问题了。附,一些非常好的参考资料:

http://www.modwest.com/help/kb6-256.html 
http://topic.csdn.net/t/20060503/07/4728521.html 
http://www.phpchina.com/5173/viewspace_5132.html 
http://www.phpx.com/pth110355.php 
更新:由此 wiLdGoose 兄说他也碰到同样的问题,但是无法解决。结果经过种种的假设和判断以后,到最后发现原来是 Zend Studio 的时区配置问题(我狂汗ing)。看来除去运行环境,开发环境也是需要注意以下的。
今天我也遇到这个问题了,我比你幸运,自己的主机,可以:
SET GLOBAL time_zone = '+8:00'; 
呵呵,你可惜了,不能用 UNIX_TIMESTAMP() 这样的函数了.

相关文章

  • PHP中通过ADO调用Access数据库的方法测试不通过

    PHP中通过ADO调用Access数据库的方法测试不通过

    PHP中通过ADO调用Access数据库的方法测试不通过...
    2006-12-12
  • PHP远程调用以及RPC框架

    PHP远程调用以及RPC框架

    这篇文章主要介绍了PHP远程调用以及RPC框架,对远程调用感兴趣的同学,可以参考下
    2021-04-04
  • php实现xml转换数组的方法示例

    php实现xml转换数组的方法示例

    这篇文章主要介绍了php实现xml转换数组的方法,结合具体实例形式分析了php操作xml格式文件实现转换数组的相关操作技巧,涉及xml格式数据的载入、遍历、转换等方法,需要的朋友可以参考下
    2017-02-02
  • PHP 实用代码收集

    PHP 实用代码收集

    PHP 是目前使用最广泛的基于 Web 的编程语言,驱动着数以百万计的网站,其中也包括如 Facebook 等一些大型站点。这里收集了 21 段实用便捷的 PHP 代码摘录,对每种类型的 PHP 开发者都会有所帮助。
    2010-01-01
  • 基于PHP读取csv文件内容的详解

    基于PHP读取csv文件内容的详解

    本篇文章是对PHP读取csv文件的内容进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php下过滤HTML代码的函数

    php下过滤HTML代码的函数

    本文通过实例代码给大家介绍了php下过滤HTML代码的函数,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2007-12-12
  • 执行、获取远程代码返回:file_get_contents 超时处理的问题详解

    执行、获取远程代码返回:file_get_contents 超时处理的问题详解

    本篇文章是对执行、获取远程代码返回:file_get_contents 超时处理的问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php使用curl详细解析及问题汇总

    php使用curl详细解析及问题汇总

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
    2016-08-08
  • MySql 按时间段查询数据方法(实例说明)

    MySql 按时间段查询数据方法(实例说明)

    oready网站的制作已经接近尾声。今天打算完成统计模块功能,所以查找了下mysql按时间段查询数据的语句,记录一下。
    2008-11-11
  • PHP面向对象学习之parent::关键字

    PHP面向对象学习之parent::关键字

    在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载。下面这篇文章主要给大家介绍了PHP面向对象之parent::关键字的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01

最新评论