在不同的时区处理PHP服务器和MySQL服务器

时间:2008-08-20 17:55:35

标签: php mysql datetime date timezone

对于我们这些使用标准共享主机软件包的用户,例如GoDaddy或Network Solutions,当您的托管服务器(PHP)和MySQL服务器位于不同的时区时,如何处理日期时间转换?

此外,是否有人提供了一些最佳做法建议,以确定您网站的访问者所在的时区并适当地操作日期时间变量?

5 个答案:

答案 0 :(得分:17)

从PHP 5.1.0开始,您可以使用date_default_timezone_set()函数设置脚本中所有日期/时间函数使用的默认时区。

对于MySql(引自MySQL Server Time Zone Support页面)

  

在MySQL 4.1.3之前,服务器仅在启动时设置的系统时区运行。从MySQL 4.1.3开始,服务器维护多个时区设置,其中一些可以在运行时修改。

您感兴趣的是时区的每个连接设置,您将在脚本的开头使用

SET timezone = 'Europe/London';

至于检测客户端时区设置,您可以使用一些JavaScript来获取并将该信息保存到cookie中,并在后续页面读取时使用它来计算正确的时区。

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

或者您可以为用户提供自己设定时区的权利。

答案 1 :(得分:11)

将所有内容存储为UTC。您可以使用客户端设置在客户端级别或服务器端进行转换。

php - date

mysql - utc-timestamp

答案 2 :(得分:3)

来自ŽeljkoŽivković的答案,如果mySQL管理员已将时区表添加到系统并保持更新,那么像'Europe / London'这样的时区描述符才有效。

否则,您只能使用“-4:00”之类的数字偏移量。幸运的是,php日期('P')格式提供了它(从5.1.3开始)

所以说你可能有一个app配置文件

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

这意味着PHP和mySQL会就使用什么时区偏移达成一致。

始终使用TIMESTAMP存储时间值。该列实际上存储为UNIX_TIME(epoch),但在写入时从当前time_zone偏移量隐式转换,并在读取时返回。

如果要显示其他时区中用户的时间,则不要使用全局define(),而是在上面设置他们的给定时区。当应用程序看到结果集时,mySQL会自动转换TIMESTAMP值(有时可能会出现问题,如果您需要实际知道事件的原始时区,那么它需要在另一列中)

并且,“为什么不将所有时间都存储为int”,这确实使您无法比较和验证日期,并且意味着总是必须转换为日期表示应用程序级别(当您直接查看数据时很难看到 - 快速,1254369600发生了什么?)

答案 3 :(得分:0)

由于之前遇到过dateTime类型的问题,我将所有日期保存为bigint。我将time()PHP函数的结果保存到它中,现在它们被计为在同一时区:)

答案 4 :(得分:0)

在php.ini文件的php set timezone中:     ini_set("date.timezone", "America/Los_Angeles");

或您可以执行的特定页面:     date_default_timezone_set("America/Los_Angeles");

在mysql中你可以这样做:    SET GLOBAL time_zone = 'America/Los_Angeles';