ConvertTimeメソッドを使うと、DateTime・DateTimeOffsetの値を異なるタイムゾーンでの日時に変換することができます。
DateTimeOffset.Offsetメソッドではオフセット値の変更はできますが、この際、夏時間などタイムゾーン内での時間調整は一切行われません。 一方TimeZoneInfo.ConvertTimeメソッドでは、変換に際してそのタイムゾーン内での時刻の変換規則に基づいた時間調整が行われます。 DateTimeOffsetだけでなく、DateTimeに対しても同様に時間調整が行われます。
TimeZoneInfo.ConvertTimeメソッドでDateTime・DateTimeOffsetを他のタームゾーンでの日時に変換する
using System;
class Sample {
static void Main()
{
// 東部標準時のTimeZoneInfoを取得
var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
// ローカルでの冬期・夏期の日付 (DateTime)
var dtWinter = new DateTime(2013, 1, 1, 12, 0, 0, DateTimeKind.Local);
var dtSummer = new DateTime(2013, 7, 1, 12, 0, 0, DateTimeKind.Local);
Console.WriteLine("{0} -> {1} {2}",
dtWinter,
est.IsDaylightSavingTime(dtWinter) ? est.DaylightName : est.StandardName,
TimeZoneInfo.ConvertTime(dtWinter, est));
Console.WriteLine("{0} -> {1} {2}",
dtSummer,
est.IsDaylightSavingTime(dtSummer) ? est.DaylightName : est.StandardName,
TimeZoneInfo.ConvertTime(dtSummer, est));
Console.WriteLine();
// ローカルでの冬期・夏期の日付 (DateTimeOffset)
var dtoWinter = new DateTimeOffset(2013, 1, 1, 12, 0, 0, TimeZoneInfo.Local.BaseUtcOffset);
var dtoSummer = new DateTimeOffset(2013, 7, 1, 12, 0, 0, TimeZoneInfo.Local.BaseUtcOffset);
Console.WriteLine("{0} -> {1} {2}",
dtoWinter,
est.IsDaylightSavingTime(dtoWinter) ? est.DaylightName : est.StandardName,
TimeZoneInfo.ConvertTime(dtoWinter, est));
Console.WriteLine("{0} -> {1} {2}",
dtoSummer,
est.IsDaylightSavingTime(dtoSummer) ? est.DaylightName : est.StandardName,
TimeZoneInfo.ConvertTime(dtoSummer, est));
}
}
日本標準時が設定されている環境での実行結果
2013/01/01 12:00:00 -> 東部標準時 2012/12/31 22:00:00 2013/07/01 12:00:00 -> 東部夏時間 2013/06/30 23:00:00 2013/01/01 12:00:00 +09:00 -> 東部標準時 2012/12/31 22:00:00 -05:00 2013/07/01 12:00:00 +09:00 -> 東部夏時間 2013/06/30 23:00:00 -04:00
あるタイムゾーンにて日時が夏時間の期間中かどうかを調べるには、IsDaylightSavingTimeメソッドが使えます。