DateTimeの表す時刻をToLocalTime・ToUniversalTimeメソッドで変換する場合、変換結果はKindプロパティの値によって変わります。 例えば、既にローカル時刻であるとされている値に対してToLocalTimeメソッドを呼び出しても得られる値は元の時刻と変わりませんが、ToUniversalTimeメソッドを呼び出せばUTCに変換された時刻が得られます。 DateTime.Kindの値とToLocalTime・ToUniversalTimeメソッドの結果は次のようになります。
DateTime.Kindの値 | ToLocalTimeの結果 | ToUniversalTimeの結果 |
---|---|---|
DateTimeKind.Local | 元の値と同じ | UTCに変換された値 |
DateTimeKind.Utc | ローカル時刻に変換された値 | 元の値と同じ |
DateTimeKind.Unspecified | (時刻の種類をUTCと仮定した上で) ローカル時刻に変換された値 |
(時刻の種類をローカル時刻と仮定した上で) UTCに変換された値 |
なお、ToLocalTimeメソッドが返すDateTimeのKindプロパティは当然DateTimeKind.Localとなります。 同様にToUniversalTimeはKindがDateTimeKind.UtcのDateTimeを返します。
以下の例はDateTimeKindが異なる日時のDateTimeに対してToLocalTime・ToUniversalTimeメソッドを呼び出した結果の違いを表示するものです。 なお、実行結果はタイムゾーンにUTC+9(日本標準時)が設定されている環境でのものです。
DateTime.ToLocalTime/ToUniversalTimeメソッドで時刻をローカル時刻・UTCに変換する
Imports System
Class Sample
Shared Sub Main()
Dim a As New DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Local)
Dim b As New DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Utc)
Dim c As New DateTime(2013, 4, 1, 15, 0, 30, 123) ' DateTimeKind.Unspecified
Console.WriteLine("[ToLocalTime]")
For Each dt As DateTime In New DateTime() {a, b, c}
Dim local As DateTime = dt.ToLocalTime() ' 時刻をローカル時刻に変換
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, local, local.Kind)
Next
Console.WriteLine()
Console.WriteLine("[ToUniversalTime]")
For Each dt As DateTime In New DateTime() {a, b, c}
Dim utc As DateTime = dt.ToUniversalTime() ' 時刻をUTCに変換
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, utc, utc.Kind)
Next
End Sub
End Class
UTC+9での実行結果
[ToLocalTime] 2013/04/01 15:00:30 Local -> 2013/04/01 15:00:30 Local 2013/04/01 15:00:30 Utc -> 2013/04/02 0:00:30 Local 2013/04/01 15:00:30 Unspecified -> 2013/04/02 0:00:30 Local [ToUniversalTime] 2013/04/01 15:00:30 Local -> 2013/04/01 6:00:30 Utc 2013/04/01 15:00:30 Utc -> 2013/04/01 15:00:30 Utc 2013/04/01 15:00:30 Unspecified -> 2013/04/01 6:00:30 Utc
日時の変換を行わずにKindプロパティの設定値のみを変更したい場合は、SpecifyKindメソッドを使います。