2008-08-20 73 views
11

对于我们这些谁使用标准共享托管的软件包,如GoDaddy或网络解决方案,你如何处理日期时间转换时,您的主机服务器(PHP)和MySQL服务器是在PHP服务器和MySQL服务器处理不同的时区?在不同的时区

此外,没有任何人有一些最佳实践的建议来确定哪个时区,一个访客到你的网站是在和适当地操纵日期时间变量?

回答

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); 

或者您可以为用户提供chioce来设置自己的时区。

11

所有都UTC。您可以使用客户端设置在客户端级别或服务器端进行转换。

php - date

mysql - utc-timestamp

+0

+1我得到的缩骨眼的样子,但我总是UNIX /划时代的时间存储为一个签名int(要签名的日期数学)。从来没有任何混乱和幸存政府TZ转移。 – Xailor 2009-12-07 20:55:13

0

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

3

REŽeljkoŽivković的回答,像'Europe/London'这样的时区描述只有在mySQL管理员已将时区表添加到系统中,并保持更新。

否则你是有限的数字偏移像“-4:00”。幸运的是PHP的日期(“P”)格式提供它(如5.1.3)

所以说,一个应用程序配置文件,你可能有

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偏移量,并在读取时返回。

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

以及“为什么不只是将所有时间存储为int”,这确实使您失去了比较和验证日期的能力,并且意味着您必须在应用程序级别转换为日期表示(并且很难当您直接观察数据的眼神 - 快,有什么事在1254369600)

0

在PHP组时区通过在php.ini文件: ini_set("date.timezone", "America/Los_Angeles");

或在特定页面,你可以这样做: date_default_timezone_set("America/Los_Angeles");

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