ConvertTimeメソッドを使うと、DateTime・DateTimeOffsetの値を異なるタイムゾーンでの日時に変換することができます。
DateTimeOffset.Offsetメソッドではオフセット値の変更はできますが、この際、夏時間などタイムゾーン内での時間調整は一切行われません。 一方TimeZoneInfo.ConvertTimeメソッドでは、変換に際してそのタイムゾーン内での時刻の変換規則に基づいた時間調整が行われます。 DateTimeOffsetだけでなく、DateTimeに対しても同様に時間調整が行われます。
TimeZoneInfo.ConvertTimeメソッドでDateTime・DateTimeOffsetを他のタームゾーンでの日時に変換する
Imports System
Class Sample
Shared Sub Main()
' 東部標準時のTimeZoneInfoを取得
Dim est As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
' ローカルでの冬期・夏期の日付 (DateTime)
Dim dtWinter As New DateTime(2013, 1, 1, 12, 0, 0, DateTimeKind.Local)
Dim dtSummer As New DateTime(2013, 7, 1, 12, 0, 0, DateTimeKind.Local)
Console.WriteLine("{0} -> {1} {2}", _
dtWinter, _
IIf(est.IsDaylightSavingTime(dtWinter), est.DaylightName, est.StandardName), _
TimeZoneInfo.ConvertTime(dtWinter, est))
Console.WriteLine("{0} -> {1} {2}", _
dtSummer, _
IIf(est.IsDaylightSavingTime(dtSummer), est.DaylightName, est.StandardName), _
TimeZoneInfo.ConvertTime(dtSummer, est))
Console.WriteLine()
' ローカルでの冬期・夏期の日付 (DateTimeOffset)
Dim dtoWinter As New DateTimeOffset(2013, 1, 1, 12, 0, 0, TimeZoneInfo.Local.BaseUtcOffset)
Dim dtoSummer As New DateTimeOffset(2013, 7, 1, 12, 0, 0, TimeZoneInfo.Local.BaseUtcOffset)
Console.WriteLine("{0} -> {1} {2}", _
dtoWinter, _
IIf(est.IsDaylightSavingTime(dtoWinter), est.DaylightName, est.StandardName), _
TimeZoneInfo.ConvertTime(dtoWinter, est))
Console.WriteLine("{0} -> {1} {2}", _
dtoSummer, _
IIf(est.IsDaylightSavingTime(dtoSummer), est.DaylightName, est.StandardName), _
TimeZoneInfo.ConvertTime(dtoSummer, est))
End Sub
End Class
日本標準時が設定されている環境での実行結果
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メソッドが使えます。