2009-06-05 118 views
0

我正在研究需要每天运行24H的应用程序,并且正在努力正确实施对DST的支持。所有时间都以UTC格式保存,但当我尝试在当地时间显示时遇到问题。现在我使用savedDate.ToLocalTime()从DB值转换为本地时间进行显示。这似乎工作正常,除了当我更改时区信息以尝试测试DST时。如果我在客户端PC上修改时区,则显示不会随新时区更新。有没有更好的方法来测试DST,还是我的转换为本地时间对于这种情况不正确?在24H应用程序中处理DST

+0

我想我可能会在下面的答案中产生混淆。这是精简版框架,还是不是?虽然我们在这里,你使用的是什么版本的.NET Framework? – lance 2009-06-05 19:44:09

+0

我使用的是.NET 2.0,而不是Compact Framework。 – 2009-06-05 19:47:38

回答

1

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

你在做什么,确切地说,是改变工作站上的时区?

+0

我正在更改我的系统时钟从东部时间到大西洋时间的时区。这是为了通过保持我的本地盒子的UTC时间相同来测试DST,但它具有当地时间变化。 – 2009-06-05 19:50:59

1

嗯。你预计实际上必须改变时区,而应用程序正在运行?如果框架在第一次获取后缓存它,我不会感到惊讶。

我会在设备上设置时区,改为“只是更改为DST之前”,运行应用程序并检查它正确地报告倍的时间。然后将时间更改为“刚刚更换DST之前”。

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

1

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

如果然后尝试这个本地时间使用savedDate.ToLocalTime()“转换”,你会得到过去存储,无需任何转换相同的日期时间值。

你需要做的是表明,所保存的日期是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(); 
0

我发现一些的.Net CF 2.0版本不正确地之间做翻译时间UTC和当地时间。这些问题围绕着几年前发生在美国时区的变化。

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

到目前为止,我还没有找到有关可能是翻译正确工作所需的最小构建的信息。

注意这不是通过应用操作系统DST修复(其,很明显,也应该被安装)固定。据我所知,它完全是CF的内在特征。我没有尝试过所有的组合,但要小心。

如果你想在CF准确的翻译,你只有两种选择:

  1. 自己做转换(非常复杂的,刚性的,且容易出错)。

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

你也许能够找到一个适合你的类库。一个很有前途的课程是World Clock/Code Project),但不幸的是它依赖于CF中不可用的注册表信息。因此,它不能直接移植到CF上。

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

对不起,这个坏消息。