我正在使用UTC来存储数据库中的日期和时间值。这些值将在客户端或按客户端时区转换为本地时间。我从MSDN文章中了解到,从UTC显示时间似乎在夏令时期间存在问题。
引用:
某个居住在美国东海岸的人键入一个值,例如“2003年10月26日01:10:00 AM”。
1)在特定的早晨,由于夏令时,在凌晨2:00,当地时钟被重置为凌晨1:00,创造了一个25小时的一天。由于在上午1:00至2:00之间的所有时钟时间值在那个特定的早晨都会发生两次,至少在美国和加拿大的大部分地区,计算机实际上无法知道指的是哪个1:10 AM - 是在切换之前还是在夏令时调整后的10分钟之后。
2)同样,在春季的某个早晨,不存在2:10 AM这样的时间。原因是在那个特定的早晨,当地时钟在凌晨2:00突然更改为凌晨3:00。整个2:00小时在这个23小时的一天中从未出现过。
如何处理情况#1,当您可能有4个交易时,在夏令时调整之前和之后各有两个?如何向用户显示交易的时间,因为由于时区偏移,最后两个交易可能比前两个交易出现更早的时间。有时,这可能是不合逻辑的,例如在邮件链中。
添加:
为了添加更多关于上下文的信息,RIA应用程序(如Silverlight/Flash)在客户端(或通过Webservice与服务器通信的任何客户端应用程序)上运行,允许用户选择投递时间或按本地PC时间安排。
如果我可以检查给定的输入时间是否无效,我可能会提醒用户。此外,对于旅行者,需要在时间点上找到时区,而不是基于用户选择,因为他们可能在不同的时区之间移动,并保存其时区设置在用户配置文件中将无济于事。
以下是一些用于评估输入时间的C#测试样例:
引用:
某个居住在美国东海岸的人键入一个值,例如“2003年10月26日01:10:00 AM”。
1)在特定的早晨,由于夏令时,在凌晨2:00,当地时钟被重置为凌晨1:00,创造了一个25小时的一天。由于在上午1:00至2:00之间的所有时钟时间值在那个特定的早晨都会发生两次,至少在美国和加拿大的大部分地区,计算机实际上无法知道指的是哪个1:10 AM - 是在切换之前还是在夏令时调整后的10分钟之后。
2)同样,在春季的某个早晨,不存在2:10 AM这样的时间。原因是在那个特定的早晨,当地时钟在凌晨2:00突然更改为凌晨3:00。整个2:00小时在这个23小时的一天中从未出现过。
如何处理情况#1,当您可能有4个交易时,在夏令时调整之前和之后各有两个?如何向用户显示交易的时间,因为由于时区偏移,最后两个交易可能比前两个交易出现更早的时间。有时,这可能是不合逻辑的,例如在邮件链中。
添加:
为了添加更多关于上下文的信息,RIA应用程序(如Silverlight/Flash)在客户端(或通过Webservice与服务器通信的任何客户端应用程序)上运行,允许用户选择投递时间或按本地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);