有关 PHP 和 MySQL 时区的一点总结
程序员文章站
2023-10-30 16:40:22
php 脚本端的市区设置可以在 php.ini 下设置 date.timezone 键的值为 'asia/sha...
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() 这样的函数了.
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 和 MySQL 时区的一点总结
-
Mysql中有关Datetime和Timestamp的使用总结
-
熟练掌握CSS+DIV,能在记事本下熟练写静态页,做过10多个静态网站项目,只懂一点PHP语法和MySQL语法,剩下的全都不懂,只自学了半个月,用什么软件,和什么框架能让我立刻参加工作,能让我这个水平也能写出PHP程序?
-
关于PHP和MYSQL的一个有关问题,需求解
-
有关于mysql数据库和php的一些小疑点,请高手指教
-
使用 PHP + MySQL 处理负载过重的数据库问题思考和总结
-
有关 PHP 和 MySQL 时区的一点总结_PHP教程
-
有关于mysql数据库和php的一些小疑点,请高手指教
-
有关 PHP 和 MySQL 时区的一点总结_PHP教程
-
有关 PHP 和 MySQL 时区的一点总结