タイムゾーン・時刻の種類に関するオプションのうち、AssumeLocal
およびAssumeUniversal
は文字列中の日時がどのタイムゾーンも表さない場合にローカル時刻もしくはUTCと見なすように指定するオプションです。 当然、オフセット値が指定されている場合は、その値が使用されます。
DateTime/DateTimeOffset.ParseExactメソッドでDateTimeStylesを指定し、時刻をローカル時刻またはUTCとみなして変換する
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.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.AssumeLocal, _
DateTimeStyles.AssumeUniversal _
}
' 文字列をDateTimeへ変換
Console.WriteLine("DateTime.ParseExact")
For Each input As String In inputs
For Each style As DateTimeStyles In styles
Dim dt As DateTime = DateTime.ParseExact(input, "o", Nothing, style)
Console.WriteLine("{0,-35} ({1,-15}) -> {2} ({3})", input, style, dt, dt.Kind)
Next
Console.WriteLine()
Next
Console.WriteLine()
' 文字列をDateTimeOffsetへ変換
Console.WriteLine("DateTimeOffset.ParseExact")
For Each input As String In inputs
For Each style As DateTimeStyles In styles
Try
Dim dto As DateTimeOffset = DateTimeOffset.ParseExact(input, "o", Nothing, style)
Console.WriteLine("{0,-35} ({1,-15}) -> {2}", input, style, dto)
Catch ex As FormatException
Console.WriteLine("{0,-35} ({1,-15}) -> (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.1234567 (AssumeLocal ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567 (AssumeUniversal) -> 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+00:00 (AssumeLocal ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+00:00 (AssumeUniversal) -> 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+09:00 (AssumeLocal ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (AssumeUniversal) -> 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-05:00 (AssumeLocal ) -> 2013/04/02 5:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (AssumeUniversal) -> 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.1234567 (AssumeLocal ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567 (AssumeUniversal) -> 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+00:00 (AssumeLocal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (AssumeUniversal) -> 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+09:00 (AssumeLocal ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567+09:00 (AssumeUniversal) -> 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-05:00 (AssumeLocal ) -> 2013/04/01 15:00:30 -05:00 2013-04-01T15:00:30.1234567-05:00 (AssumeUniversal) -> 2013/04/01 15:00:30 -05:00