安排未来时间本质上是hard,因为你不知道未来会发生什么变化。这与记录过去的时间完全不同。
对于过去的时间事件,您真正需要的是本地日期和时间,以及与 UTC 的偏移量(许多平台将其称为“DateTimeOffset”)。
但对于未来的事件,您不一定知道偏移量是多少。你可以guess它是基于您当前对时区信息的了解,但该信息可能会发生变化。事实上,随着世界各国政府对夏令时和其他情况的改变,它每年都会发生多次变化。
由于您无法可靠地确定偏移量,因此您也无法确定准确的 UTC 时间戳。因此,保留原始当地时间非常重要。如果您要计算 UTC 时间戳,您还应该重新计算任何时候您更新时区数据。
我已经多次写过这个问题了(here https://stackoverflow.com/a/19627330/634824, here https://stackoverflow.com/a/19170823/634824 and here https://serverfault.com/a/554761/100701)。我建议你阅读这些帖子。
现在你提出了我以前没有提到的一点,否则我会把你的问题标记为重复。也就是说,如果事件地点完全因为时区边界发生变化而转移到新的时区,该怎么办?
我同意 Deceze 的观点,你需要考虑这种情况的可能性有多大以及失败的后果有多么严重。在我看来,这可能不值得投入大量时间。如果您将来安排了一个活动,并且该位置发生了新的时区,您可以随时返回并编辑该活动。您需要问自己您的应用程序需要了解多少有关时区更改的详细信息。我使用过的大多数调度系统都不处理这方面的问题。
如果你确实想处理这件事,那么你需要的不仅仅是城市。您应该存储该位置的纬度和经度坐标。然后你可以使用其中之一这些方法 https://stackoverflow.com/q/16086962/634824从这些坐标解析时区。但还要注意,您需要确保时区边界的来源尽可能是最新的。
另请注意,IANA 时区数据库 http://www.iana.org/time-zones这是时区数据的原始来源,根本不保留边界数据!大多数边界数据来自独立来源,例如Eric Muller 的 shapefile http://efele.net/maps/tz/world/,截至今天与 IANA 数据库的 2013b 数据(即 2013i)一致,因此时区数据至少有 7 次更新,这些更新要么没有更改任何边界,要么没有跟踪更改。