我正在使用 UTC 在数据库中存储数据和时间值。这些值在客户端或每个客户端时区转换为本地时间。我从MSDN 文章中了解了这些场景,其中显示来自 UTC 的时间似乎在夏令时造成了问题。
居住在美国东海岸的人输入了诸如“Oct 26, 2003 01:10:00 AM”之类的值。
1) 在这个特定的早晨,由于夏令时,凌晨 2:00,本地时钟重置为凌晨 1:00,创建 25 小时制的一天。由于在上午 1:00 和凌晨 2:00 之间的所有时钟时间值在那个特定的早晨出现两次——至少在美国和加拿大的大部分地区,计算机真的无法知道上午 1:10 的含义——切换前发生的事件,或夏令时切换后 10 分钟发生的事件。
2) 同样,问题发生在春天,在某个特定的早晨,没有凌晨 2:10 这样的时间。原因是在那个特定的早晨 2:00,本地时钟的时间突然变为凌晨 3:00。在这 23 小时的一天中,整个 2:00 小时都不会发生。
您是如何处理第 1 种情况的,当您可能有 4 个事务时,两个在切换之前,两个在切换之后在夏令时?如何向用户显示交易的时间,因为由于班次,最后两笔交易可能比前两笔交易显示的时间更早。?有时,它可能被证明是不合逻辑的,例如:在邮件链中。
添加:
要添加有关上下文的更多信息,RIA 应用程序(例如 Silverlight/Flash)在客户端(或任何通过 Web 服务与服务器对话的客户端应用程序)上运行,允许用户选择交付时间或使用 pc 本地时间安排时间。
如果我可以检查给定的输入时间是否无效,我可能会提醒用户。此外,对于旅行者来说,需要在时间点找到时区,而不是基于用户选择,因为他们可能会在区域之间移动,将他们的时区保存在用户配置文件中也无济于事。
一些用于评估输入时间的 C# 测试示例:
//2:30 am CT to UTC --> 8:30 am
DateTime dt = new DateTime(2009, 03, 08, 2, 30, 00, DateTimeKind.Local);
//8:30 am UTC to CT --> 3:30 am.. which is as expected
DateTime dt1 = new DateTime(2009, 03, 08, 8, 30, 00, DateTimeKind.Utc);
//check for daylight saving time returns false.. ??
TimeZoneInfo.Local.IsDaylightSavingTime(dt);
//check for daylight saving time returns true
TimeZoneInfo.Local.IsInvalidTime(dt);