有关 PHP 和 MySQL 时区的一点总结
时间:2007-11-20
来源:互联网
原创文档,转载请注明链接:http://www.gracecode.com/Archive/Display/206
由于暂时使用国外的空间,在我发布 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')
这样就可以解决问题了。附,一些非常好的参考资料:
1. http://www.modwest.com/help/kb6-256.html
2. http://topic.csdn.net/t/20060503/07/4728521.html
3. [url=../5173/viewspace_5132.html]http://www.phpchina.com/5173/viewspace_5132.html[/url]
4. http://www.phpx.com/pth110355.php
由于暂时使用国外的空间,在我发布 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')
这样就可以解决问题了。附,一些非常好的参考资料:
1. http://www.modwest.com/help/kb6-256.html
2. http://topic.csdn.net/t/20060503/07/4728521.html
3. [url=../5173/viewspace_5132.html]http://www.phpchina.com/5173/viewspace_5132.html[/url]
4. http://www.phpx.com/pth110355.php
作者: amdk6 发布时间: 2007-11-19
对了。我有个朋友他在澳大利亚,他的博客是在美国,而 澳大利亚 是实行夏令时的,也就是 夏天的时候比北京时间早3个小时,其他时候早2个小时,他应该怎么弄这个呢? 是否也是像您刚才直接设置时区呢?
作者: riechie 发布时间: 2008-02-19
鼓励一下啊咯。

作者: luzhou 发布时间: 2008-02-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28