タイムゾーン・時刻の種類に関するオプションのうち、AdjustToUniversal
およびRoudtripKind
は解析した日時の補正に関するオプションです。
AdjustToUniversal
が指定された場合は、解析した日時をUTCに補正します。 このため、DateTime.Kindは常にDateTimeKind.Utc
、DateTimeOffset.Offsetは00:00:00
となります。 文字列中の日時がどのタイムゾーンも表さない場合、時刻の補正は行われず、DateTime.KindにはDateTimeKind.Unspecified
が設定されます。
一方RoudtripKind
が指定された場合は、解析した日時の種類とタイムゾーン情報を維持します。 時刻にZ
やGMT
などのUTCであることを表す文字列が含まれていれば、DateTimeKind.Utc
として扱われます。 このオプションはDateTimeOffsetでは無視されます。
DateTime/DateTimeOffset.ParseExactメソッドでDateTimeStylesを指定し、変換した時刻のオフセットを補正または維持する
Imports System
Imports System.Globalization
Class Sample
Shared Sub Main()
Dim inputs() As String = New String() { _
"2013-04-01T15:00:30.1234567", _
"2013-04-01T15:00:30.1234567Z", _
"2013-04-01T15:00:30.1234567+00:00", _
"2013-04-01T15:00:30.1234567+09:00", _
"2013-04-01T15:00:30.1234567-05:00" _
}
Dim styles() As DateTimeStyles = New DateTimeStyles() { _
DateTimeStyles.None, _
DateTimeStyles.AdjustToUniversal, _
DateTimeStyles.RoundtripKind _
}
' 文字列をDateTimeへ変換
Console.WriteLine("DateTime.ParseExact")
For Each style As DateTimeStyles In styles
For Each input As String In inputs
Dim dt As DateTime = DateTime.ParseExact(input, "o", Nothing, style)
Console.WriteLine("{0,-35} ({1,-18}) -> {2} ({3})", input, style, dt, dt.Kind)
Next
Console.WriteLine()
Next
Console.WriteLine()
' 文字列をDateTimeOffsetへ変換
Console.WriteLine("DateTimeOffset.ParseExact")
For Each style As DateTimeStyles In styles
For Each input As String In inputs
Try
Dim dto As DateTimeOffset = DateTimeOffset.ParseExact(input, "o", Nothing, style)
Console.WriteLine("{0,-35} ({1,-18}) -> {2}", input, style, dto)
Catch ex As FormatException
Console.WriteLine("{0,-35} ({1,-18}) -> (FormatException)", input, style)
End Try
Next
Console.WriteLine()
Next
Console.WriteLine()
End Sub
End Class
UTC+9の環境での実行結果例
DateTime.ParseExact 2013-04-01T15:00:30.1234567 (None ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (None ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+00:00 (None ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (None ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (None ) -> 2013/04/02 5:00:30 (Local) 2013-04-01T15:00:30.1234567 (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+00:00 (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+09:00 (AdjustToUniversal ) -> 2013/04/01 6:00:30 (Utc) 2013-04-01T15:00:30.1234567-05:00 (AdjustToUniversal ) -> 2013/04/01 20:00:30 (Utc) 2013-04-01T15:00:30.1234567 (RoundtripKind ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (RoundtripKind ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+00:00 (RoundtripKind ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (RoundtripKind ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (RoundtripKind ) -> 2013/04/02 5:00:30 (Local) DateTimeOffset.ParseExact 2013-04-01T15:00:30.1234567 (None ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567Z (None ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (None ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (None ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567-05:00 (None ) -> 2013/04/01 15:00:30 -05:00 2013-04-01T15:00:30.1234567 (AdjustToUniversal ) -> 2013/04/01 6:00:30 +00:00 2013-04-01T15:00:30.1234567Z (AdjustToUniversal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (AdjustToUniversal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (AdjustToUniversal ) -> 2013/04/01 6:00:30 +00:00 2013-04-01T15:00:30.1234567-05:00 (AdjustToUniversal ) -> 2013/04/01 20:00:30 +00:00 2013-04-01T15:00:30.1234567 (RoundtripKind ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567Z (RoundtripKind ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (RoundtripKind ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (RoundtripKind ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567-05:00 (RoundtripKind ) -> 2013/04/01 15:00:30 -05:00