我正在使用ASP.NET 3.5和SQL Server 2008编写日历网站,并希望以最佳方式处理时区。我读过这些消息来源:
Daylight saving time and time zone best practices
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版本被大量使用,但很多应用程序都是用.NET编写的,那么他们在做什么呢?
答案 0 :(得分:0)
并不是真的认为这是正确的答案,但认为最好发布作为答案 - 这是正确的,这也是正确的,也只是因为它更容易阅读/遵循这种方式。
如果我朝着正确的方向前进,请告诉我:
使用DateTimeOffset和TimeZoneInfo类
在数据库中保存DateTimeOffset值和偏移量。还保存TimeZoneInfo.id(tz id)。
在使用数据库中的值之前,始终将保存的偏移量与当前的TimeZoneInfo偏移量进行比较,并通过差值调整DateTimeOffset值。这就解决了“政府改变规则”的问题,并将“东部时间下午4点”保持为“东部时间下午4点”(即使由于新规则而与UTC的偏差发生了变化)。
要查找查找特定日期/时间或范围的查询,只要规则发生变化(通过govt),请通过并“修复”数据库中的每条记录。该修复与上面#3使用的步骤相同,但在修复后保存新值。
这是其他人在做什么的吗?关于#4并不是真正的疯狂,因为我需要在Windows更新应用新规则的同时执行此操作...在Windows更新和数据库更新完成之间的任何时间,它都可能产生无效的查询结果。我想这就是“定期维护”的目的,但我们目前没有这么严格的政策。