我们在运行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年的记录。
答案 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点。