如何将日期,时间和UTC偏移量转换为本地DateTime

时间:2019-12-03 07:21:24

标签: vb.net datetime timezone

我需要从以下XML元素获取本地时区datetime:

<TransactionDate>20191202</TransactionDate>
<TransactionTime>234026</TransactionTime>
<TransactionTimezone>UTC-06:00:00</TransactionTimezone>

我的本​​地UTC偏移量是-05:00:00。将TransactionDate和TransactionTime放入td和tt Date变量后,我可以像这样构建Datetime:

Dim ldDate As New Date(td.Year, td.Month, td.Day, tt.Hour, tt.Minute, tt.Second)

我可以从TransactionTimeZone中解析出“ -06”,并确定我需要向ldDate添加1小时,但是必须有一种更优雅的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我编写了一个小过程,该过程从原始TimeZone中的DateTime返回本地TimeZone中的DateTime:

Public Function P_ConvertToLocalDatetime(ByVal aOriginDateTime As Date, 
                                         ByVal aOriginTimeZone As String, 
                                         ByRef aLocalDateTime As Date) As Boolean

    Try
        Dim liHour As Integer = CInt(Strings.Mid(aOriginTimeZone, 4, 3))
        Dim liMinute As Integer = CInt(Strings.Mid(aOriginTimeZone, 8, 2))
        Dim liSecond As Integer = CInt(Strings.Right(aOriginTimeZone, 2))
        With aOriginDateTime
            Dim offset As New DateTimeOffset(.Year, .Month, .Day, .Hour, .Minute, .Second, New TimeSpan(liHour, liMinute, liSecond))
            aLocalDateTime = offset.LocalDateTime
        End With
        Return True

    Catch ex As Exception
        Return False
    End Try
End Function

我这样称呼它:

Dim lLocalDateTime as Date        
If Not P_ConvertToLocalDatetime(aTransactionDatetime, 
                                aTransactionTimezone, 
                                aLocalDateTime) Then
    Throw New Exception("Unable to convert TransactionDatetime to local time")
End If

...,其中aTransactionTimezone的类型为String,其值类似于"UTC-6:00:00"

答案 1 :(得分:0)

如果您有来自世界各地的交易 ,这可能会帮助您用作基础并不断改进。

Private Function FromWorldTimeToMyLocalTime(noSpacesDateTimeTransaction As String, transactionZoneString As String) As Date
    Dim transactionDtTime As Date = Date.ParseExact(noSpacesDateTimeTransaction, "yyyyMMddHHmmss", Globalization.CultureInfo.InvariantCulture)
    Return DateAndTime.DateAdd(DateInterval.Hour, TimeZoneInfo.FindSystemTimeZoneById(transactionZoneString).BaseUtcOffset.TotalHours, transactionDtTime)
End Function

用法(此处示例显示交易是由Hawai完成的):

 ‘Here is your complete string as you have in your xml tags (date + time) it’s presumed the transaction is come by  Hawai 
 Dim myDateTimeFromTransactionTime As String = FromWorldTimeToMyLocalTime("20191202234026", "Hawaiian Standard Time").ToString
 Console.WriteLine("MyTime from transaction is " & myDateTimeFromTransactionTime)

要获取所有时区信息,您可以使用它来了解一下。

Dim timeZones As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones()
For Each timeZoneInfo As TimeZoneInfo In timeZones
    Console.WriteLine(CStr(timeZoneInfo.Id) & "  " & CStr(timeZoneInfo.BaseUtcOffset.TotalHours))
Next