タイム ゾーンの概要

TimeZoneInfo クラスを使用すると、タイム ゾーン対応アプリケーションを簡単に作成できます。 TimeZone クラスでは、ローカル タイム ゾーンと協定世界時 (UTC) の操作がサポートされます。 TimeZoneInfo クラスでは、これらのゾーンと、レジストリで定義済みの情報に関するタイム ゾーンの両方がサポートされます。 TimeZoneInfo を使用して、システムに情報がないカスタムのタイム ゾーンを定義することもできます。

タイム ゾーンの要点

タイム ゾーンは、同じ時刻が使用されている地域です。 常にではありませんが、通常、隣接するタイム ゾーンは 1 時間違いです。 世界のタイム ゾーンの時刻は、世界協定時刻 (UTC) からのオフセットとして表されます。

世界のタイム ゾーンの多くは、夏時間をサポートしています。 夏時間では、春や初夏には時刻を 1 時間進め、晩夏や秋には通常 (または標準) の時間に戻すことで、日中の時間を最大化しようと試みます。 こうした標準時間前後の変更は、調整規則と呼ばれます。

特定のタイム ゾーンの夏時間前後の移行は、固定調整規則または浮動調整規則で定義できます。 固定調整規則では、毎年、夏時間前後の移行が行われる特定の日付を設定します。 たとえば、毎年 10 月 25 日に行われる夏時間から標準時間への移行は、固定調整規則に従います。 浮動調整規則の方がはるかに一般的です。浮動調整規則では、夏時間への移行、または夏時間からの移行について特定の月の特定の週の特定の曜日が設定されます。 たとえば、3 月の第 3 日曜日に行われる標準時間から夏時間への移行は、浮動調整規則に従います。

調整規則をサポートするタイム ゾーンの場合、夏時間前後の移行によって、2 つの変則的な時刻が生じます。無効な時刻とあいまいな時刻です。 無効な時刻は、標準時間から夏時間への移行で生じる存在しない時刻です。 たとえば、移行が特定の日付の午前 2:00 に行われ、時刻が午前 3:00 に変更される場合、午前 2:00 から午前 2:59:59 までの時刻は無効です。 あいまいな時刻は、1 つのタイム ゾーンで 2 つの時刻にマップできる時刻です。 あいまいな時刻は夏時間から標準時間への移行で生じます。 たとえば、移行が特定の日付の午前 2:00 に行われ、時刻が午前 1:00 に変更される場合、午前 1:00 から午前 1:59:59 までの時刻は標準時間または夏時間のいずれにでも解釈できます。

タイム ゾーンの用語

次の表は、タイム ゾーンを使用し、タイム ゾーン対応アプリケーションを開発するときに一般的に使用される用語の定義一覧です。

期間 定義
調整規則 標準時間から夏時間へ、および夏時間から標準時間への移行が行われるタイミングを定義した規則。 各調整規則には、規則を適用する期間を定義する開始日と終了日 (たとえば、1986 年 1 月 1 日から 2006 年 12 月 31 日に調整規則が適用されます)、差分 (調整規則を適用した結果として標準時間が変更される時間)、調整期間中に移行が行われる特定の日付と時刻に関する情報が含まれています。 移行は、固定規則または浮動規則に従う可能性があります。
あいまいな時刻 1 つのタイム ゾーンで 2 つの時刻にマップできる時刻です。 あいまいな時刻は、あるタイム ゾーンの夏時間から標準時間に移行する際など、時計の時刻を前に戻すときに発生します。 たとえば、移行が特定の日付の午前 2:00 に行われ、時刻が午前 1:00 に変更される場合、午前 1:00 から午前 1:59:59 までの時刻は標準時間または夏時間のいずれにでも解釈できます。
固定規則 夏時間前後の移行について特定の日付を設定する調整規則。 たとえば、毎年 10 月 25 日に行われる夏時間から標準時間への移行は、固定調整規則に従います。
浮動規則 浮動調整規則の方がはるかに一般的です。浮動調整規則では、夏時間への移行、または夏時間からの移行について特定の月の特定の週の特定の曜日が設定されます。 たとえば、3 月の第 3 日曜日に行われる標準時間から夏時間への移行は、浮動調整規則に従います。
無効な時刻 標準時間から夏時間への移行中に生じる存在しない時刻。 無効な時刻は、あるタイム ゾーンの標準時間から夏時間に移行する際など、時計の時刻を前に進めるときに発生します。 たとえば、移行が特定の日付の午前 2:00 に行われ、時刻が午前 3:00 に変更される場合、午前 2:00 から午前 2:59:59 までの時刻は無効です。
移行時間 特定のタイム ゾーンで実施される夏時間と標準時間の切り替えなど、特定の時間切り替えに関する情報。

タイム ゾーンと TimeZoneInfo クラス

.NET では、TimeZoneInfo オブジェクトはタイム ゾーンを表します。 TimeZoneInfo クラスには、TimeZoneInfo.AdjustmentRule オブジェクトの配列を返す GetAdjustmentRules メソッドが含まれています。 この配列の各要素により、特定の期間の夏時間との間の移行に関する情報が提供されます (夏時間をサポートしていないタイム ゾーンの場合、メソッドからは空の配列が返されます)。各 TimeZoneInfo.AdjustmentRule オブジェクトには、夏時間との間の移行の特定の日付と時刻を定義する DaylightTransitionStart および DaylightTransitionEnd プロパティがあります。 IsFixedDateRule プロパティは、その移行が固定と浮動のどちらであるかを示します。

.NET は、Windows オペレーティング システムによって提供され、レジストリに格納されているタイム ゾーン情報に依存しています。 地球のタイム ゾーンの数のため、既存のタイム ゾーンがすべてレジストリに表示されるわけではありません。 また、レジストリは動的な構造であるため、定義済みのタイム ゾーンを追加または削除することができます。 最後に、レジストリに必ずしも過去のタイム ゾーン データが含まれるとは限りません。 たとえば、Windows XP では、レジストリにタイム ゾーン調整の 1 つのセットのみに関するデータが含まれています。 Windows Vista では、動的なタイム ゾーン データがサポートされています。つまり、1 つのタイム ゾーンには、特定の年間隔で適用される複数の調整規則を含めることができます。 しかし、Windows Vista レジストリで定義され、夏時間をサポートするほとんどのタイム ゾーンには、定義済みの調整規則が 1 つまたは 2 つしかありません。

レジストリへの TimeZoneInfo クラスの依存は、タイム ゾーン対応アプリケーションが、レジストリで特定のタイム ゾーンが定義されていることを特定できないことを意味します。 そのため、(ローカルのタイム ゾーンまたは UTC を示すタイム ゾーン以外の) 特定のタイム ゾーンをインスタンス化する場合、例外処理を使用する必要があります。 また、レジストリから必要な TimeZoneInfo オブジェクトをインスタンス化できない場合でもアプリケーションを続行できる何らかのメソッドを用意する必要があります。

必要なタイム ゾーンが存在しない場合に対処するために、TimeZoneInfo クラスには CreateCustomTimeZone メソッドが含まれています。これを使用して、レジストリに見つからないカスタム タイム ゾーンを作成できます。 カスタム タイム ゾーンの作成について詳しくは、「方法 : 調整規則のないタイム ゾーンを作成する」と「方法 : 調整規則のあるタイム ゾーンを作成する」を参照してください。 また、ToSerializedString メソッドを使用して、新しく作成されたタイム ゾーンを文字列に変換し、データ ストア (データベース、テキスト ファイル、レジストリ、アプリケーション リソースなど) にそれを保存することができます。 その後、FromSerializedString メソッドを使用して、この文字列を TimeZoneInfo オブジェクトに変換して戻します。 詳細については、「方法: 埋め込みリソースにタイム ゾーンを保存する」および「方法: 埋め込みリソースからタイム ゾーンを復元する」を参照してください。

各タイム ゾーンは、UTC からのベース オフセットと、既存の調整規則を反映した UTC からのオフセットによって表されるため、あるタイム ゾーンの時刻は、簡単に別のタイム ゾーンの時間に変換できます。 この目的で、TimeZoneInfo オブジェクトには、次のようにいくつかの変換メソッドが含まれています。

  • ConvertTimeFromUtc。UTC を指定されたタイム ゾーンの時刻に変換します。

  • ConvertTimeToUtc。指定されたタイム ゾーンの時刻を UTC に変換します。

  • ConvertTime。指定されたタイム ゾーンの時刻を、指定された別のタイム ゾーンの時刻に変換します。

  • ConvertTimeBySystemTimeZoneId。(TimeZoneInfo オブジェクトではなく) タイム ゾーン ID をパラメーターとして使用し、指定されたあるタイム ゾーンの時刻を指定された別のタイム ゾーンの時刻に変換します。

タイム ゾーン間の時間を変換する方法の詳細については、「タイム ゾーン間での時刻の変換」を参照してください。

関連項目