pen*_*ate 5 .net time timezone datetime dst
我使用 UTC 在数据库中存储数据和时间值。这些值将转换为客户端上的本地时间或每个客户端时区。我从MSDN 文章中了解了这些场景,在夏令时期间显示 UTC 时间似乎会带来问题。
\n\n\n\n\n居住在美国东海岸的某人输入了一个值,例如“Oct 26, 2003 01:10:00 AM”。
\n\n1) 在这个特定的早晨,由于实行夏令时,在凌晨 2:00,本地时钟将重置为凌晨 1:00,从而创建 25 小时制的一天。由于 1:00 AM 和 2:00 AM 之间的所有\n 时钟时间值在该特定早晨\xe2\x80\x94 出现两次,至少在美国和加拿大的大部分地区\n,\n 计算机确实无法知道\n 上午 1:10 指的是\xe2\x80\x94,是在夏令时切换之前\n 发生的时间,还是\n 夏令时切换之后\n 10 分钟发生的\n 时间。
\n\n2) 同样,问题发生在春天,在某个特定的早晨,没有凌晨 2:10 这样的时间。原因是在那个特定的早晨 2:00,本地时钟的时间突然变为凌晨 3:00。在这个 23 小时制的一天中,整个 2:00 小时永远不会发生。
\n
您如何处理第 1 种情况,即您可能有 4 笔交易,其中两笔在转换之前,两笔在夏令时转换之后?如何向用户显示交易时间,因为由于轮班,最后两笔交易的显示时间可能早于前两笔交易。有时,这可能被证明是不合逻辑的,例如:在邮件链中。
\n\n添加:
\n\n要添加有关上下文的更多信息,在客户端(或通过 Web 服务与服务器通信的任何客户端应用程序)上运行的 RIA 应用程序(例如 Silverlight/Flash)允许用户选择交付时间或使用 PC 当地时间进行安排。
\n\n如果我可以检查给定输入时间的无效时间,我可能会提醒用户。此外,对于旅行者来说,需要在时间点找到时区,而不是基于用户选择,因为他们可能会在区域之间移动,并且将时区保存在用户个人资料中不会有帮助。
\n\n一些用于评估输入时间的 C# 测试示例:
\n\n//2:30 am CT to UTC --> 8:30 am \nDateTime dt = new DateTime(2009, 03, 08, 2, 30, 00, DateTimeKind.Local); \n\n//8:30 am UTC to CT --> 3:30 am.. which is as expected \nDateTime dt1 = new DateTime(2009, 03, 08, 8, 30, 00, DateTimeKind.Utc); \n\n//check for daylight saving time returns false.. ?? \nTimeZoneInfo.Local.IsDaylightSavingTime(dt); \n\n//check for daylight saving time returns true \nTimeZoneInfo.Local.IsInvalidTime(dt); \n
Run Code Online (Sandbox Code Playgroud)\n
这些场景都是提倡使用夏令时的案例。只要以UTC 格式存储和排序值,显示什么并不重要。也就是说,如果正确使用 UTC,这些场景中出现的问题就可以解决。
是的,看到这样的记录会令人困惑:12:30、1:20、1:10、3:30,但如果这就是它们根据 UTC 排序的方式(真正发生的情况),我认为这是正确的方法做吧。
SO 通过以 UTC 记录所有内容,然后以 UTC 或相对时间(例如“17 分钟前...”)显示所有内容,从而完全避免了此问题。
如果您指的是评论中建议的用户提供的日期/时间,我有一些坏消息给您:它很糟糕。我认为最好、最明显的解决方案是选择一个规则并遵循它。如果您确实需要完美地处理它,那么您的 UI 将需要扩展以迂腐地处理这种每年仅发生 1 小时的边缘情况,然后仅处理非实时创建的交易(因为如果它们是真实的) -时间,您就会知道夏令时的等效时间)。