4

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

该问题于 2013 年 8 月首次出现。

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

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

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

因此,似乎是在 8 月 Windows 更新中引入了时区规则更改,从而导致了这种情况。

我发现了以下内容:http: //support.microsoft.com/kb/2863058,这表明在 2013 年 8 月应用了累积时区更新,但似乎没有美国规则与此更改有关。

有没有其他人遇到过这个问题,(当然)有解决方案?

编辑

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

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

4

2 回答 2

2

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

您可以使用 Format 函数或 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=year、M=month、d=day、h=hour、m=minute、s=seconds。

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

于 2013-11-20T08:59:26.450 回答
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 小时。

于 2013-11-22T05:00:18.363 回答