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

处理不同时区的PHP服务器和MySQL服务器,php,mysql,datetime,date,timezone,Php,Mysql,Datetime,Date,Timezone,对于我们这些使用标准共享托管软件包(如GoDaddy或网络解决方案)的人来说,当托管服务器(PHP)和MySQL服务器位于不同的时区时,如何处理日期时间转换 另外,是否有人提供了一些最佳实践建议,用于确定网站访问者所在的时区,并适当地操作日期时间变量?将所有内容存储为UTC。您可以在客户机级别进行转换,也可以使用客户机设置在服务器端进行转换 从PHP 5.1.0开始,您可以使用函数设置脚本中所有日期/时间函数使用的默认时区 对于MySql(引自第页) 在MySQL 4.1.3之前,服务器仅在启

对于我们这些使用标准共享托管软件包(如GoDaddy或网络解决方案)的人来说,当托管服务器(PHP)和MySQL服务器位于不同的时区时,如何处理日期时间转换


另外,是否有人提供了一些最佳实践建议,用于确定网站访问者所在的时区,并适当地操作日期时间变量?

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


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

对于MySql(引自第页)

在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来自行设置时区。

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

REŽeljkoŽivković的答案是,只有当mySQL管理员将时区表添加到系统中并不断更新时,“Europe/London”等时区描述符才会起作用

否则,将限制为诸如'-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将同意使用什么时区偏移量

始终使用时间戳存储时间值。该列实际上存储为UNIX_TIME(历元),但在写入时隐式地从当前时区偏移量转换,在读取时隐式转换回当前时区偏移量

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


至于“为什么不将所有时间都存储为int”,这确实会使您失去比较和验证日期的能力,这意味着您必须始终在应用程序级别转换为日期表示(当您直接查看数据时,这对眼睛很难-很快,在1254369600发生了什么?)

在php中,通过在php.ini文件中设置时区:
ini_set(“日期、时区”、“美国/洛杉矶”)

或者在特定页面中,您可以执行以下操作:
date\u default\u timezone\u set(“美国/洛杉矶”)

在mysql中,您可以执行以下操作:
设置全球时区='美国/洛杉矶'

+1我有一种眼花缭乱的表情,但我总是将unix/epoch时间存储为带符号的int(希望为日期数学签名)。永远不会出现任何混乱,并且能够在政府的TZ转移中幸存下来。+1,在数据级别保持简单和规范化(=UTC)使得逻辑很难出错。任何特定于语言环境的转换只能在显示级别进行。