过去和未来事件的UTC和DST

时间:2016-04-17 11:10:21

标签: timezone utc dst

我正在开发一个仅在单个时区使用的系统,但是与在utc中公开日期和时间的其他系统集成,因此我们认为我们也一直都在使用utc。我们之前也听说过,将你的时间存储在utc中仍然是要走的路,所以感觉这是最简单的方法来减少麻烦。最近,我们遇到了一些麻烦。我们正在系统中记录对用户有价值的事件,因此我们让用户搜索并查看它们。瑞典位于+1时区,因此当地时间0900的比赛将被保存为0800时间。当向用户显示事件时,我们可以成功地将它们转换回当地时间,直到最近的夏令时开始。将0800 utc转换为当地时间现在将增加2小时。现在记录的事件似乎发生在10:00。我该怎么处理?在这种情况下,如果存储的时间与实际保存到db的时间相同,我可以查看日期并根据dst是否在该特定时间打开或关闭进行调整。但是,我认为我需要一个通用的解决方案,因为在系统的不同时间(在其他地方)会创建时间戳,需要表示未来和过去的时间点。对我来说,看起来我有两个选择。 1.当我与使用utc的其他系统集成时,返回存储本地时间并做一些额外的工作,或者2.每个utc时间戳存储一些数据,这些数据可以告诉我是否在dst期间创建了时间戳。我错了吗?对?遗漏了什么?

2 个答案:

答案 0 :(得分:0)

您始终可以使用getTimezoneOffset方法获取客户端时区偏移量。现在剩下的就是将此时区偏移量应用于数据库中存储的UTC日期,并向最终用户显示正确的日期。另一方面,如果在数据库中记录事件时需要显示用户使用的时区偏移量,那么您肯定会在数据库中添加一列来记录此偏移量。当您想要处理多个时区时,事情会变得棘手:当您想要向印度用户显示瑞典用户提交的记录时会发生什么?

答案 1 :(得分:0)

你最不想要的是你不能把瑞典视为+1时区。时区和时区偏移是两个非常不同的事情。有关详细信息,请阅读the timezone tag wiki

相反,您可以采取以下两种方法之一:

  1. 根据它IANA tzdb identifier来考虑时区。对于瑞典,请使用Europe/Stockholm。使用实现tz数据库的语言,库或平台,使用此时区在UTC和当地时间之间进行转换。

  2. 不要弄清楚客户端时区是什么,而是依靠客户端操作系统将转换转换为本地时间。大多数环境(包括Web浏览器中的JavaScript)可以从UTC转换为本地时间,反之亦然。使用此方法,仅在客户端和服务器之间传输UTC时间。

  3. 此外,您没有在问题中提问,但在您的标题中,您提到了 future 事件。这是一个非常不同的场景,通常要求您捕获本地时间和IANA时区。请参阅this answer for more details

    您可能还希望阅读Daylight saving time and time zone best practices