2013-03-12 143 views
0

我正在创建一个基于调度约会的应用程序,在用户可以选择他们想要的时区的环境中。如何正确存储和使用不同时区的MySQL TIMESTAMP?

经过一番研究,我确信使用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时区时,时间为小时off

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

回答

2

如果您使用;

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

... MySQL的服务器时区将是一个小时,从太平洋时间在夏天,因为PDTGMT-07:00。反而使用例如;

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

... MySQL的服务器时间将支持DST的变化,你应该得到正确的时区转换。

由于MySQL并不总是包含所有可用的时区,所以如果系统中缺少America/Los_Angeles时区,则this page should help you install it

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

+0

我一定是以社区不喜欢的方式表达了我的问题,但我确定他们是否像我们一样真正理解了我的问题,它就不会被封闭。谢谢。 – 2013-03-15 03:46:43

0

为什么不在数据库中存储UTC的时间(格林威治标准时间与我们英语喜欢的一样)?

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

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

+0

那么,我假设MYSQL的TIMESTAMP列自动存储所有时间为UTC。这似乎做得很好,但现在出于某种原因,在2天前发生的夏令时之后,我的时间已经过去了一个小时。 – 2013-03-12 06:33:40

相关问题