当我们的UTC服务器数据库返回日期时,Windows非常有用地将日期更改为日期时间(例如2017年6月23日至2017-06-23 00:00),然后对当前时区进行调整(到,说2017-06-22 16:00)...多年来我们一直使用下面的代码将其转换回来......
大约四个月前,运行Windows 7(Windows 10似乎没有受到影响)的用户没有选中“自动调整夏令时的时钟”,或者生活在像亚利桑那州这样的选项不可用的状态下,注意到报告从前一天返回日期 - 我们的数据库返回正确的日期,但转换不再正常工作..
有什么建议吗?
由于
Public Function LocalDateFormat(ByVal InputDate As Date) As String
Dim vDate As String = InputDate.ToString("d", System.Globalization.CultureInfo.InvariantCulture)
Dim LocalZone As TimeZone = TimeZone.CurrentTimeZone
Dim CurrentOffset As TimeSpan = LocalZone.GetUtcOffset(InputDate)
Dim DayLightSaving As Boolean = LocalZone.IsDaylightSavingTime(InputDate)
Dim CalculatedOffset As New DateTime(InputDate.Ticks, DateTimeKind.Local)
If CurrentOffset.CompareTo(TimeSpan.Zero) < 0 Then
CalculatedOffset -= LocalZone.GetUtcOffset(InputDate)
If DayLightSaving = True Then
CalculatedOffset = CalculatedOffset.AddHours(1)
End If
Else
CalculatedOffset += LocalZone.GetUtcOffset(InputDate)
If DayLightSaving = True Then
CalculatedOffset = CalculatedOffset.AddHours(-1)
End If
End If
InputDate = CalculatedOffset
Dim vCulture As String = System.Globalization.CultureInfo.CurrentCulture.ToString
Dim vReturnDate As String = ""
Select Case vCulture
Case "en-US"
vReturnDate = Format(InputDate, "MM/dd/yyyy")
Case "en-GB"
vReturnDate = Format(InputDate, "dd/MM/yyyy")
Case Else
vReturnDate = Format(InputDate, "dd/MM/yyyy")
End Select
Return vReturnDate
End Function
答案 0 :(得分:1)
您的整个功能可以重写为:
Public Function LocalDateFormat(ByVal InputDate As Date) As String
Return InputDate.ToLocalTime().ToShortDateString()
End Function
如果代码太小,您可能想重新考虑一下在功能中是否有任何好处。
至于为什么你现有的功能没有正常工作:
TimeZone.GetUtcOffset
已经考虑了DST是否生效,尽管它在MSDN文档中描述了一些问题。TimeZone
。如果您需要使用时区,请使用TimeZoneInfo
或Noda Time。在这种情况下,您不需要其中任何一个,因为您只是从UTC转换为当地时间,这是DateTime.ToLocalTime
所做的。你说它在Windows 10上工作正常,但我很抱歉 - 这是一个错误的代码,无论它在哪里运行都会出错。只需使用框架提供的内置API即可。不要重新发明轮子。 :)