我正在使用ASP编写一个日历网站。NET 3.5和SQL Server 2008,并希望以最佳方式处理时区。我读过这些来源:
夏令时和时区最佳实践
http://noda-time.blogspot.com/
http://msdn.microsoft.com/en-us/library/ms973825.aspx.
我已经记下了所有的一般信息,但很难将其转换为实际代码。不想找人帮我写代码,但如果我知道其他人在为这个非常具体的案例做什么,那会有所帮助(日历应用程序,事件的日期/时间,因为即使规则改变,"东部时间下午5点"也应该始终是"东部时间5点")。
你在用吗。NET DateTimeOffset和TimeZoneInfo类?我看不出他们支持"使用2011年1月2日的规则将UTC时间转换为EST"之类的东西,我认为这是创建一个"正确"处理时区的日历应用程序所需的控制级别。我也不认为每个人都在使用Noda Time,因为我几乎找不到任何关于该库的例子或讨论。可能Java版本被大量使用,但很多应用程序都是用Java编写的。NET,那么他们在做什么?
并不认为这是正确的答案,但认为最好将其作为答案发布——这很可能是正确的,也只是因为这样更容易阅读/遵循。
如果我的方向正确,请告诉我:
-
使用DateTimeOffset和TimeZoneInfo类
-
在数据库中保存DateTimeOffset值和偏移量。另存TimeZoneInfo.id(tz id)。
-
在使用数据库中的值之前,请始终将保存的偏移量与当前TimeZoneInfo偏移量进行比较,并根据差值调整DateTimeOffset值。这就是解决"政府改变了规则"问题的方法,并将"东部时间下午4点"保持为"东部时间凌晨4点"(即使与UTC的偏移量因新规则而改变)。
-
要使查找特定日期/时间或范围的查询起作用,只要规则发生变化(由政府),请检查并"修复"数据库中的每一条记录。修复与上面#3中使用的步骤相同,但在修复后保存新值。
这是别人在做的事吗?对#4并不疯狂,因为我需要在Windows更新应用新规则的同时这样做。。。在Windows更新和我的数据库更新完成之间的任何时间,它都可能产生无效的查询结果。我想这就是"定期维护"的目的,但我们目前没有这么严格的政策。