日期时间类型
在 .Net 框架的 2.0 版中,Microsoft 引入了DateTime.Kind 属性。不同的种类如下:
Local
Unspecified
Utc
每个Date
(底层 CLR 类型是DateTime
)对象都具有Kind
属性,该属性指定该对象的日期类型。也就是说,它指定日期值是本地、UTC 还是未知的。
如果Date
对象具有,则在调用该函数Kind = Local
时不执行任何转换。ToLocalTime
从DateTime.ToLocalTime 方法,重点是我的:
种类结果(ToLocalTime)
------------ --------------------------------------- --
Utc 此 DateTime 实例被转换为本地时间。
本地 不执行转换。
未指定 DateTime 的此实例假定为 UTC 时间,
并且转换的执行就像 Kind 是 UTC 一样。
这如何适用于您的情况?
当你使用CDate
时,结果Kind
是Local
。这意味着当您调用ToLocal
它时,不会发生转换:
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
日期。第三个块显示当您指定 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 日期并将其转换为本地时间。