对于我们这些谁使用标准共享托管的软件包,如GoDaddy或网络解决方案,你如何处理日期时间转换时,您的主机服务器(PHP)和MySQL服务器是在PHP服务器和MySQL服务器处理不同的时区?在不同的时区
此外,没有任何人有一些最佳实践的建议来确定哪个时区,一个访客到你的网站是在和适当地操纵日期时间变量?
对于我们这些谁使用标准共享托管的软件包,如GoDaddy或网络解决方案,你如何处理日期时间转换时,您的主机服务器(PHP)和MySQL服务器是在PHP服务器和MySQL服务器处理不同的时区?在不同的时区
此外,没有任何人有一些最佳实践的建议来确定哪个时区,一个访客到你的网站是在和适当地操纵日期时间变量?
自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来设置自己的时区。
由于之前有过dateTime类型的问题,我将所有日期保存为bigint。我将时间()PHP函数的结果保存到它中,现在它们被视为处于同一时区:)
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)
在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';
+1我得到的缩骨眼的样子,但我总是UNIX /划时代的时间存储为一个签名int(要签名的日期数学)。从来没有任何混乱和幸存政府TZ转移。 – Xailor 2009-12-07 20:55:13