DateTimeの表す時刻をToLocalTimeToUniversalTimeメソッドで変換する場合、変換結果はKindプロパティの値によって変わります。 例えば、既にローカル時刻であるとされている値に対してToLocalTimeメソッドを呼び出しても得られる値は元の時刻と変わりませんが、ToUniversalTimeメソッドを呼び出せばUTCに変換された時刻が得られます。 DateTime.Kindの値とToLocalTime・ToUniversalTimeメソッドの結果は次のようになります。

DateTime.Kindの値とToLocalTime・ToUniversalメソッドの呼び出し結果
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メソッドを使います。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。