在24H应用中处理DST

时间:2009-06-05 19:26:07

标签: c# .net timezone

我正在开发一个需要每天24小时运行的应用程序,并正在努力正确实现对DST的支持。所有时间目前都以UTC格式存储,但是当我尝试在当地时间显示时,我遇到了问题。现在我正在使用savedDate.ToLocalTime()将DB值转换为本地时间进行显示。这似乎工作正常,除了我为了测试DST而更改时区信息。如果我在客户端PC上修改时区,则显示不会使用新时区更新。有没有更好的方法来测试DST,或者我在这种情况下转换为本地时间是不正确的?

4 个答案:

答案 0 :(得分:1)

我记得在阅读DST报告时,或许关于Compact Framework,关于.NET不是最可靠的。更可靠的是以当地时间和UTC获得当前时间,然后自己确定(并在将来调整中使用)差异。如果不是真的有必要,这似乎是一条可怕的路线。我会看看我是否能找到一个参考资料来备份我记得的我想起的

你究竟在做什么来改变工作站上的时区?

答案 1 :(得分:1)

嗯。您是否希望在应用程序运行时实际必须更改时区?如果框架在首次获取之后缓存它,我不会感到惊讶。

我会在设备上设置时区,将时间更改为“就在更改为DST之前”,运行应用并检查其报告时间是否正确。然后将时间更改为“就在更改DST之前”。

请记住,根据您的设备和时区数据库的年龄,它可能不知道几年前美国的DST变化。 (啊,时区。要爱他们。)

答案 2 :(得分:1)

如果从数据库中检索DateTime值,通常会获得一个DateTime,其Kind属性设置为DateTimeKind.Unspecified。基本上是因为我所知道的任何特定于数据库的DateTime类型(例如SqlDateTime)都不包含时区信息。

如果您尝试使用savedDate.ToLocalTime()将其“转换”为本地时间,您将获得存储的相同DateTime值,而不进行任何转换。

您需要做的是在执行转换之前表明保存的日期是UTC格式,例如:

DateTime savedDateTime = (DateTime) reader["SomeDateTimeColumn"];

// Convert from unspecified to UTC
DateTime utcDateTime = savedDateTime.SpecifyKind(savedDateTime, DateTimeKind.Utc);
...
// Convert from UTC to local
DateTime localDateTime = utcDateTime.ToLocalTime();

答案 3 :(得分:0)

我发现一些.Net CF 2.0版本没有正确地在UTC和本地时间之间进行时间转换。问题围绕着几年前美国时区发生的变化。

症状是DST似乎不会被认为在4月(旧规则)而不是3月(新规则)生效。据推测,DST变更的后端(10月/ 11月)也存在问题。

到目前为止,我还没有找到有关翻译正常工作所需的最低版本的信息。

请注意,这不是通过应用操作系统DST修复程序(显然也应该安装)修复的。据我所知,它完全是固有的CF.我没有尝试过所有组合,但要小心。

如果您想要CF中的准确翻译,您只有两个选择:

  1. 自己进行转换(非常复杂,严格且容易出错)。

  2. 确保您在设备上拥有必要的.Net和操作系统补丁,以便准确翻译。

  3. 您也可以找到适合您的类库。一个有希望的类是World Clock / Code Project),但不幸的是它依赖于CF中没有的注册表信息。因此,它不能直接移植到CF.

    最后,任何自己动手的解决方案都需要提供时区信息(UTC偏移,DST开/关日期等)。并且始终准确。

    抱歉这个坏消息。