奇怪的日期解析结果

时间:2016-11-15 15:31:21

标签: vb.net datetime timestamp

我正在尝试制作一个小帮手应用程序来帮助阅读SCCM日志。在得到时区偏移量之前,解析日期非常简单。它通常采用" + ???"的形式。文字示例:" 11-01-2016 11:44:25.630 + 480"

DateTime.parse()在大多数情况下处理得很好。但偶尔我会遇到一个抛出异常的时间戳。我无法弄清楚为什么。这是我需要帮助的地方。请参阅下面的示例代码:

Dim dateA As DateTime = Nothing
Dim dateB As DateTime = Nothing
Dim dateStr_A As String = "11-07-2016 16:43:51.541+600"
Dim dateStr_B As String = "11-01-2016 11:44:25.630+480"

dateA = DateTime.Parse(dateStr_A)
dateB = DateTime.Parse(dateStr_B)

MsgBox(dateA.ToString & vbCrLf & dateB.ToString)

如果运行,似乎dateStr_B是无效的时间戳?为什么是这样?我试图弄清楚如何使用' zzz'来处理+480。使用.ParseExact()格式,如Date Formatting MSDN

所示

我错过了时区偏移的东西吗?我搜索过高和低,但这些SCCM日志似乎使用非标准的方式来表示偏移量。任何见解将不胜感激

2 个答案:

答案 0 :(得分:0)

问题是+480确实是无效的偏移量。 UTC的偏移格式(使用"zzz" Custom Format Specifier时产生的格式)是小时和分钟。 +600比UTC早6小时0分钟,这是有效的。 +480将比UTC提前4小时80分钟,这是无效的,因为分钟数不能超过59.

如果你有一些日期和时间字符串的外部来源使用的偏移量只是几分钟(即+600表示10小时而+480表示8小时),则需要在使用前调整偏移量{ {1}}或DateTime.Parse

[编辑] 以下函数采用带有正偏移或负偏移(任意位数)的时间戳(以分钟为单位),并返回DateTime。如果时间戳不是有效格式,则抛出ArgumentException。

DateTime.ParseExact

答案 1 :(得分:0)

感谢您的见解。我有一种感觉,我需要手动处理。我只是想确保在这个过程中我没有遗漏一些简单的东西。我对日期和时间格式的了解有点缺乏。

因此,我改变了我的代码,以便处理偏移量。当然,我将不得不在最终产品中添加更多的输入验证。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dateA As DateTime = Nothing
        Dim dateB As DateTime = Nothing
        Dim dateStr_A As String = correctOffset("11-07-2016 16:43:51.541+600")
        Dim dateStr_B As String = correctOffset("11-07-2016 16:43:51.541+480")

        dateA = DateTime.Parse(dateStr_A)
        dateB = DateTime.Parse(dateStr_B)

        MsgBox(dateA.ToString & vbCrLf & dateB.ToString)
    End Sub

    Public Function correctOffset(ByVal ts As String)
        Dim offset As Integer = CInt(ts.Substring(ts.Length - 3))
        Dim offHour As Integer = offset / 60
        Dim offMin As Integer = offset - (offHour * 60)

        Dim strhour As String = Nothing
        Dim strmin As String = Nothing

        If offHour <= 9 Then
            strhour = "0" & CStr(offHour)
        Else
            strhour = CStr(offHour)
        End If

        If offMin <= 9 Then
            strmin = "0" & CStr(offMin)
        Else
            strmin = CStr(offMin)
        End If

        Return ts.Substring(0, ts.Length - 3) & strhour & ":" & strmin
    End Function