gpt4 book ai didi

vb.net - .NET 将日期时间和 UTC 转换为本地时间的奇怪行为

转载 作者:行者123 更新时间:2023-12-05 07:59:57 25 4
gpt4 key购买 nike

我正在修改旧应用程序,我发现了一个大错误。我在西类牙,此应用正在读取此处的一些文件,其中包含 UTC 字符串格式的日期,需要进行转换。

由于以下格式,字符串值已使用 CDate 转换为本地时间:
“yyyy-MM-yyTHH:mmZ”

但此处的代码使用 .ToLocalTime 将日期再次转换为本地值,可能会使时间再次更改为不正确的值。

现在出现了奇怪的事实,var 取了正确的值,但代码没有返回那个值。在 Visual Studio 的“检查”部分,您可以看到结果应该是 0,而不是 22(第二天的 0 点)。

Visual Studio error

这里发生了什么?

编辑:

应用程序正在读取 XML 文件,此时正在读取:

<IntervaloTiempo v="2013-10-26T19:33Z/2013-10-26T22:00Z"/>

代码如截图所示:

Valor = Split(.Value, "/")

dtUTC = CDate(Valor(0))
iHoraIn = Hour(dtUTC.ToLocalTime().AddHours(1))

我用这个更正了代码,应用程序以同样的方式工作:

iHoraIn = dtUTC.AddHours(1).Hour

编辑 2:

因为我的帖子在评论中看起来很难理解,所以我会尝试澄清一些事情。

我正在使用 Visual Studio 2005 和 .NET Framework 2.0。

dtUTC 中的值已转换为本地时间,如您在屏幕截图中所见,其值为 21:33,应返回 22 AddHour(1).Hour

当使用 dtUTC.ToLocalTime() 时,它的小时应该被转换为 23:33 值,它应该返回 0 AddHour(1).小时.

正如您在“检查”窗口中看到的那样,这就是行为。问题是,var iHoraIn 的最终值是 22,这是正确的,但代码不是。

实际上,将代码更改为仅删除 ToLocalTime() 部分会使最终值相同。

有人可以解释为什么会这样吗?这是错误吗?

最佳答案

DateTime.Kind

在 .Net 框架的 2.0 版中,Microsoft 引入了 DateTime.Kind property .不同种类如下:

Local
Unspecified
Utc

每个 Date(底层 CLR 类型是 DateTime)对象都有 Kind 属性,该属性指定该对象的日期类型。也就是说,它指定日期值是本地、UTC 还是未知。

如果 Date 对象具有 Kind = Local,则调用 ToLocalTime 函数时不会执行任何转换。来自DateTime.ToLocalTime method , 重点是我的:

Kind        Results (of ToLocalTime)----------- -----------------------------------------Utc         This instance of DateTime is converted to local time.Local       No conversion is performed.Unspecified This instance of DateTime is assumed to be a UTC time,            and the conversion is performed as if Kind were UTC.

How does this apply to your situation?

When you use CDate, the resulting Kind is Local. This means that when you call ToLocal on it, no conversion takes place:

Dim valor = "2013-10-26T19:33Z"
Dim dtUTC = CDate(valor)
' dtUTC.Kind is Local
' The following does not do any conversion
Dim dtLocal = dtUTC.ToLocal()

一个更完整的例子

此示例展示了当您使用 CDate 时会发生什么,以及当显式设置 Kind 时会发生什么。前两个代码块是等效的 - CDate 创建一个 Local 日期。第三 block 显示指定 UTC 日期时发生的情况。

Sub Main()
Dim valor = "2013-10-26T19:33Z"

Dim dtUTC = CDate(valor)
Dim dtLocal = dtUTC.ToLocalTime()
Dim iHoraIn = Hour(dtLocal.AddHours(1))
Dim kind = dtUTC.Kind
printDate(dtUTC, dtLocal, iHoraIn, kind)

Dim dtUTC2 = DateTime.SpecifyKind(dtUTC, DateTimeKind.Local)
Dim dtLocal2 = dtUTC2.ToLocalTime()
Dim iHoraIn2 = Hour(dtLocal2.AddHours(1))
Dim kind2 = dtUTC2.Kind
printDate(dtUTC2, dtLocal2, iHoraIn2, kind2)

Dim dtUTC3 = DateTime.SpecifyKind(dtUTC, DateTimeKind.Utc)
Dim dtLocal3 = dtUTC3.ToLocalTime()
Dim iHoraIn3 = Hour(dtLocal3.AddHours(1))
Dim kind3 = dtUTC3.Kind
printDate(dtUTC3, dtLocal3, iHoraIn3, kind3)
End Sub

Sub printDate(ByVal dtUtc, ByVal dtLocal, ByVal hora, ByVal utcKind)
System.Console.WriteLine("UTC: {0}, UTC KIND: {1}, LOCAL: {2}, HORA: {3}", dtUtc, utcKind, dtLocal, hora)
End Sub

上面的代码产生了这样的输出:

UTC: 2013-10-26 09:33:00 PM, UTC KIND: Local, LOCAL: 2013-10-26 09:33:00 PM, HORA: 22
UTC: 2013-10-26 09:33:00 PM, UTC KIND: Local, LOCAL: 2013-10-26 09:33:00 PM, HORA: 22
UTC: 2013-10-26 09:33:00 PM, UTC KIND: Utc, LOCAL: 2013-10-26 11:33:00 PM, HORA: 0

所以您看到的不是错误 - 这是预期的行为。您正在尝试转换您认为是 UTC 日期的日期;但实际上它确实是本地日期。

我相信您期望看到的是上面第三个代码块中发生的事情。它创建一个 UTC 日期并将其转换为本地时间。

关于vb.net - .NET 将日期时间和 UTC 转换为本地时间的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com