PHP和SQL中的时区夏令时问题

时间:2010-09-02 21:46:03

标签: php sql sql-server tsql sql-server-2008

所以在我的PHP代码中,我为用户做了时区选择,其中我有一个时区表和GMT的小时值。然后,只要用户在SETTINGS中选择他的时区,我就会使用它来添加DATETIME列值。

所以我有两个功能:从数据库中的DATETIME列读取,以及写入DATETIME列。显然,第一个我需要在向用户显示之前“添加”时区差异(在SQL中使用DATEADD()),而第二个我需要在将数据存储到数据库之前“减去”时区差异(也使用DATEADD())。这样,我所有存储的时区都是GMT,并根据用户时区的选择进行查看。

然而,夏令时是问题所在。我应该采取什么方法(无论是在SQL级别还是PHP级别)来解决这个问题?在SQL中使用DATEADD()足以照顾DAYLIGHT储蓄?我没有线索。请帮忙!

2 个答案:

答案 0 :(得分:2)

使用SQL 2008,您有新的数据时间DATETIMEOFFSET,其时区感知为偏移量(而不是时区名称)。使用此数据类型,您可以获取任何值的UTC时间,然后您可以根据用户时区(这是PHP代码中的转换)正确呈现它。另一种选择是始终以旧的DATETIME数据类型存储UTC。无论你做什么,从用户本地到UTC以及从UTC到用户本地的转换属于PHP中的呈现,而不属于SQL,因此DATEADD没有放在此代码中。 PHP DateTime具有时区支持,可以节省夏令时。

答案 1 :(得分:0)

GMT没有夏令时,因此您所有存储的时间都不应该在其中节省日光。在存储和检索之前,您还应该计算夏令时。世界上只有一些地区使用它。

所以回答你的问题没有DATEADD()不够好。如果您已经找到了它们的位置,那么如果该时区可以节省时间,可以使用另一张桌子或其他东西来查找。但即使在某些地区,某些地区也有夏令时,而其他地区则没有。