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

Dealing with PHP server and MySQL server in different time zones

对于使用标准共享托管包(如godaddy或网络解决方案)的人,当托管服务器(php)和mysql服务器位于不同的时区时,如何处理日期时间转换?

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


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

对于mysql(引自mysql服务器时区支持页面)

Before MySQL 4.1.3, the server operates only in the system time zone set at startup. Beginning with MySQL 4.1.3, the server maintains several time zone settings, some of which can be modified at runtime.

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

1
SET timezone = 'Europe/London';

至于检测客户机时区设置,您可以使用一点javascript来获取信息并将其保存到cookie中,然后在随后的页面读取中使用它来计算正确的时区。

1
2
3
4
//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,让他们自己设置时区。


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

php-日期

MySQL-UTC时间戳


答案是什么?Eljko?伊夫科维?,只有当mysql管理员将时区表添加到系统中并保持更新时,类似"欧洲/伦敦"的时区描述符才有效。

否则,您只能使用数字偏移,如"-4:00"。幸运的是,php日期("p")格式提供了它(从5.1.3开始)

所以在应用程序配置文件中

1
2
3
4
5
6
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时间(epoch),但在写入时从当前时区偏移量隐式转换,在读取时返回。

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

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


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

或者在特定的页面中,您可以这样做:江户十一〔一〕号

在MySQL中,您可以这样做:埃多克斯1〔2〕


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