DateTime.ToLocalTime()于2013年8月停止在XP上运行

时间:2013-11-20 08:33:12

标签: vb.net datetime dst windows-update

我们在运行XP的客户PC上安装了一个VB.NET应用程序,看起来DateTime.ToLocalTime()已经停止工作。

问题首先出现在2013年8月。

客户位于德克萨斯州,他们的时区是正确的。

DateTime.ToLocalTime()的文档有以下有趣的注释:

在Windows XP系统上,ToLocalTime方法仅在从UTC转换为本地时识别当前调整规则。因此,当前调整规则生效前的时段转换可能无法准确反映UTC与当地时间之间的差异。

因此,8月Windows Update中可能会出现时区规则更改,这导致了这种情况。

我发现以下内容:http://support.microsoft.com/kb/2863058表示2013年8月已应用累积时区更新,但此更改中似乎没有涉及美国规则。

有没有其他人有这个问题的经验,并且(当然)有解决方案?

修改

澄清一下。有问题的时间以UTC格式存储在SQL数据库中,我们将转换为LocalTime进行显示。这是引起问题的显示器。

在当地时间1500点录制的事件现在显示为2100年的记录。

2 个答案:

答案 0 :(得分:2)

您能为客户重新编码产品吗?

您可以使用格式化功能或DateTime.Now,它可以为您提供本地计算机的日期和时间详细信息

尝试一下:

        Textbox1.text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt") 
        Textbox1.Text = Format(now, "yyyy-MM-dd hh:mm:ss")

您可以更改字符串中的日期时间详细信息,只需记住y =年,M =月,d =日,h =小时,m =分钟,s =秒。

如果您有后端数据库,我建议您从中获取时间。 (这取决于数据库)

答案 1 :(得分:0)

这只是一个猜测,因为你没有显示任何代码。 (请在您的问题中显示代码,这样可以更轻松地提供帮助!)

德克萨斯目前处于中央标准时间,即UTC-6。由于您报告的时间(1500,2100)之间有6个小时的差异,我的猜测是您正在以某种方式转换两次

由于.Kind附加了DateTime属性,因此在正常情况下不会发生这种情况。例如:

DateTime dt1 = new DateTime(2013, 11, 22, 3, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("{0:HH:mm} ({1})", dt1, dt1.Kind);  // 3:00 (Utc)

DateTime dt2 = dt1.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt2, dt2.Kind);  // 21:00 (Local)

DateTime dt3 = dt2.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt3, dt3.Kind);  // 21:00 (Local)

但是,如果你以某种方式忘记了那种并且它被设置回“未指定”,那么双重转换可能会发生:

DateTime dt1 = new DateTime(2013, 11, 22, 3, 0, 0, DateTimeKind.Utc);
Debug.WriteLine("{0:HH:mm} ({1})", dt1, dt1.Kind);  // 3:00 (Utc)

DateTime dt2 = dt1.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt2, dt2.Kind);  // 21:00 (Local)

// somehow, the kind is getting set back to unspecified in your code
dt2 = DateTime.SpecifyKind(dt2, DateTimeKind.Unspecified);

DateTime dt3 = dt2.ToLocalTime();
Debug.WriteLine("{0:HH:mm} ({1})", dt3, dt3.Kind);  // 15:00 (Local)

现在,您实际上不太可能正在呼叫DateTime.SpecifyKind。相反,我会在你的代码中查找将本地时间存储回数据库而不是UTC时间的地方。

或者可能是您将本地DateTime转换为字符串并通过解析该字符串将其读回另一个DateTime。这可能发生在UI代码中。也许您需要在表单上的用户收集时指定Local类型?

您应该调试代码并逐步完成,以便了解它是如何转换的。我想你会找到答案。

不,2013年8月Windows时区更新中没有任何内容会影响美国。美国的最后一次DST变化发生在2007年。即使这样,你也会在1小时内离开,而不是6点。