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に変換する
using System;
class Sample {
static void Main()
{
var a = new DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Local);
var b = new DateTime(2013, 4, 1, 15, 0, 30, 123, DateTimeKind.Utc);
var c = new DateTime(2013, 4, 1, 15, 0, 30, 123); // DateTimeKind.Unspecified
Console.WriteLine("[ToLocalTime]");
foreach (var dt in new[] {a, b, c}) {
var local = dt.ToLocalTime(); // 時刻をローカル時刻に変換
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, local, local.Kind);
}
Console.WriteLine();
Console.WriteLine("[ToUniversalTime]");
foreach (var dt in new[] {a, b, c}) {
var utc = dt.ToUniversalTime(); // 時刻をUTCに変換
Console.WriteLine("{0} {1,-12} -> {2} {3}", dt, dt.Kind, utc, utc.Kind);
}
}
}
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メソッドを使います。