2016-11-15 20 views
0

私は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は無効なタイムスタンプに見えますか?どうしてこれなの?私は、ここに示すように.ParseExact()形式を使用して 'zzz'を使用して+480を処理する方法を見つけようとしました。Date Formatting MSDN

タイムゾーンオフセットに何かがありません。私は高低を検索しましたが、これらのSCCMログはオフセットを表す非標準的な方法を使用しているようです。どんな洞察力があれば幸いです。

答えて

0

問題は+480が本当に無効なオフセットであることです。 "zzz" Custom Format Specifierを使用して作成されたUTCからのオフセットの形式は時間と分です。 +600はUTCより6時間0分早く有効です。 +480はUTCより4時間80分早く、59分を超えることはできません。

オフセットを使用する日付と時刻の文字列がある場合は、 (つまり+600は10時間、+480は8時間を意味します)DateTime.ParseまたはDateTime.ParseExactを使用する前にオフセットを調整する必要があります。

[編集] 次の関数は、正のオフセットまたは負のオフセット(任意の桁数)のタイムスタンプを分単位で取り、DateTimeを返します。タイムスタンプが有効な形式でない場合は、ArgumentExceptionがスローされます。

+0

洞察をいただきありがとうございます。私はあなたの提案に基づいて私の暫定的なソリューションを追加しました。 – Wariv

+0

投稿編集:とてもクールです。私は間違いなくここで多くを学んでいます。私はあなたにこれを使用する時間を割いていただき、ありがとうございます。 – Wariv

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 
+0

私はSCCMタイムスタンプの形式に慣れていません(これが私の答えにオフセット補正をコーディングしなかった理由です)。投稿したコードは、あなたの質問の2つの例で動作するように見えますが、他のケースを処理する必要がありますか?オフセットは正の値ではなく負の値にできますか?オフセットは常に3文字ですか、それとも2文字か4文字ですか? – Blackwood

+0

コードが 'Option Strict On'でコンパイルされるようにいくつかの変更を提案します。 (1)correctOffset関数に 'As'節を含む:' Public Function correctOffset(ByVal ts As String)As String'。 (2)整数除算演算子( '\')を60で除算して、結果が整数であることを示します: 'Dim offHour As Integer = offset \ 60'。 – Blackwood

+0

サーバーログの一部を確認し、3桁以下のケースがどのように処理されるかを確認する必要があります。私は個人的に何も見ていないが、それは私が当時のそれらのケースを探していなかったためかもしれない。実際に負のオフセットを使用している場合は、12時間が720分で4桁を超えることがあります.24時間以内に前後に進むことができるのであれば、12時間のオフセットを超えることは奇妙です。 ( ')を使用していただきありがとうございます。私はそれが事であることを知らなかった。 本番用の厳密な入力検証チェックを作成します。 – Wariv