DateTimeOffsetでも、DateTimeの場合と同様にToLocalTime・ToUniversalTimeメソッドで時刻を変換することができます。 さらに、ToOffsetメソッドで任意のオフセット値に変更した時刻に変換することも出来ます。
ToLocalTimeメソッドが返すDateTimeOffsetのOffsetプロパティは当然ローカル時刻のオフセット値と同じになります。 同様にToUniversalTimeはOffsetが 00:00:00 のDateTimeOffsetを返し、ToOffsetは指定したオフセット値が設定されたDateTimeOffsetを返します。
以下の例は、オフセット値が異なる日時のDateTimeOffsetに対してToLocalTime・ToUniversalTime・ToOffsetの各メソッドを呼び出した結果の違いを表示するものです。 なお、実行結果はタイムゾーンにUTC+9(日本標準時)が設定されている環境でのものです。
DateTimeOffset.ToLocalTime/ToUniversalTime/ToOffsetメソッドでローカル時刻・UTC・指定したオフセット値に変換されたDateTimeOffsetを取得する
using System;
class Sample {
static void Main()
{
var a = new DateTimeOffset(2013, 4, 1, 15, 0, 30, 123, new TimeSpan(+9, 0, 0));
var b = new DateTimeOffset(2013, 4, 1, 15, 0, 30, 123, new TimeSpan(-5, 0, 0));
var c = new DateTimeOffset(2013, 4, 1, 15, 0, 30, 123, TimeSpan.Zero);
Console.WriteLine("[ToLocalTime]");
foreach (var dto in new[] {a, b, c}) {
var local = dto.ToLocalTime(); // 時刻をローカル時刻に変換
Console.WriteLine("{0} -> {1}", dto, local);
}
Console.WriteLine();
Console.WriteLine("[ToUniversalTime]");
foreach (var dto in new[] {a, b, c}) {
var utc = dto.ToUniversalTime();
Console.WriteLine("{0} -> {1}", dto, utc); // 時刻をUTCに変換
}
Console.WriteLine();
Console.WriteLine("[ToOffset]");
foreach (var dto in new[] {a, b, c}) {
var est = dto.ToOffset(new TimeSpan(-5, 0, 0)); // 時刻をUTC-5(EST、東部標準時)に変換
Console.WriteLine("{0} -> {1}", dto, est);
}
}
}
UTC+9での実行結果
[ToLocalTime] 2013/04/01 15:00:30 +09:00 -> 2013/04/01 15:00:30 +09:00 2013/04/01 15:00:30 -05:00 -> 2013/04/02 5:00:30 +09:00 2013/04/01 15:00:30 +00:00 -> 2013/04/02 0:00:30 +09:00 [ToUniversalTime] 2013/04/01 15:00:30 +09:00 -> 2013/04/01 6:00:30 +00:00 2013/04/01 15:00:30 -05:00 -> 2013/04/01 20:00:30 +00:00 2013/04/01 15:00:30 +00:00 -> 2013/04/01 15:00:30 +00:00 [ToOffset] 2013/04/01 15:00:30 +09:00 -> 2013/04/01 1:00:30 -05:00 2013/04/01 15:00:30 -05:00 -> 2013/04/01 15:00:30 -05:00 2013/04/01 15:00:30 +00:00 -> 2013/04/01 10:00:30 -05:00
ToLocalTimeメソッドでは、実行環境に設定されているタイムゾーンに従って夏時間等の時間調整を考慮した変換が行われます。 一方、ToOffsetメソッドでは、単に指定されたオフセット値への変換のみが行われ、夏時間等の考慮はされません。 夏時間等の調整が必要なタイムゾーンへの変換を行う場合は、TimeZoneInfo.ConvertTimeメソッドを使う必要があります。