如何正确存储和使用MySQL TIMESTAMP与不同的时区?

时间:2013-03-12 05:17:05

标签: php mysql

我正在创建一个基于日程安排的应用程序,在用户可以选择所需时区的环境中。

在做了一些研究之后,我确信使用MYSQL的TIMESTAMP来存储所有日期。我,当使用TIMESTAMP时,所有日期都将被转换并存储为UTC。然后,当从数据库中提取日期时,TIMESTAMP列将转换为MYSQL的时区。

以下是我当前设置的一些示例代码:

在每个页面上,为PHP和MYSQL 设置时区(基于用户选择。此示例为PST)

date_default_timezone_set('US/Pacific');
SET time_zone = '-08:00'

在为MYSQL投入时间时,我只想将时间戳转换为正确的格式。

date("Y-m-d H:i:s", $unix_timestamp);

在拉动数据库时,我只需使用MYSQL转换为UNIX。

SELECT UNIX_TIMESTAMP(created_at) as created_at FROM `table` WHERE id=1

这很优雅,似乎完美无缺。 MySQL正在为我做所有繁重的时区转换,只需使用TIMESTAMP即可。也就是说,直到夏令时发生。现在,无论何时选择非UTC时区,时间都是小时

我在做什么,错了?请帮忙!

2 个答案:

答案 0 :(得分:2)

如果您使用;

date_default_timezone_set('US/Pacific');
SET time_zone = '-08:00'

...自PDT GMT-07:00以来,MySQL的服务器时区距太平洋时间一小时。而是使用例如;

date_default_timezone_set('US/Pacific');
SET time_zone = 'America/Los_Angeles';

...并且MySQL的服务器时间将支持DST更改,您应该获得正确的时区转换。

由于MySQL并不总是包含所有可用时区,因此系统中缺少时区America/Los_Angelesthis page should help you install it

由于您正在为每个用户使用动态时区,因此您可能需要某种查找表来在MySQL和PHP时区之间进行转换,因此您可以根据用户设置它们。

答案 1 :(得分:0)

为什么不在数据库中存储UTC时间(GMT和我们英国人喜欢的那样)?

然后在mySql中使用CONVERT_TZ()函数或在PHP中使用setTimezone

这将使人们能够轻松查看其他人的日历并转换为当地时间。因此,没有人有理由过早或过晚(或在错误的一天!)。