我正在创建一个基于日程安排的应用程序,在用户可以选择所需时区的环境中。
在做了一些研究之后,我确信使用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时区,时间都是小时。
我在做什么,错了?请帮忙!
答案 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_Angeles
,this page should help you install it。
由于您正在为每个用户使用动态时区,因此您可能需要某种查找表来在MySQL和PHP时区之间进行转换,因此您可以根据用户设置它们。
答案 1 :(得分:0)
为什么不在数据库中存储UTC时间(GMT和我们英国人喜欢的那样)?
然后在mySql中使用CONVERT_TZ()函数或在PHP中使用setTimezone。
这将使人们能够轻松查看其他人的日历并转换为当地时间。因此,没有人有理由过早或过晚(或在错误的一天!)。