タイム ゾーンの概要
更新 : 2007 年 11 月
TimeZoneInfo クラスを使用すると、タイム ゾーンに対応したアプリケーションを簡単に作成できます。TimeZone クラスは、ローカル タイム ゾーンと世界協定時刻 (UTC: Coordinated Universal Time) の処理をサポートします。TimeZoneInfo クラスは、これら両方のゾーンに加えて、レジストリで情報が定義されている任意のタイム ゾーンもサポートします。また、TimeZoneInfo を使用すると、システムに情報のないカスタム タイム ゾーンを定義することもできます。
タイム ゾーンの基本事項
タイム ゾーンとは、同じ時間を使用する地理的な領域です。必ずではありませんが、一般には、隣接するタイム ゾーンの時間差は 1 時間です。世界のすべてのタイム ゾーンの時刻は、UTC からのオフセットとして表すことができます。
世界のタイム ゾーンの多くは、夏時間をサポートしています。夏時間とは、日中の時間を最大にするために、春または初夏に時刻を 1 時間進めて、晩夏または秋に通常の (標準の) 時刻に戻すことです。標準時刻に対するこのような変更は、調整規則と呼ばれます。
特定のタイム ゾーンにおける夏時間の開始および終了時の切り替えは、固定調整規則または浮動調整規則のいずれかで定義できます。固定調整規則では、夏時間への切り替えや夏時間からの切り替えを毎年同じ日に行います。たとえば、夏時間から標準時間への切り替えを毎年 10 月 25 日に行うのは、固定調整規則です。これよりも一般的なのが浮動調整規則で、特定の月の特定の週の特定の曜日に、夏時間への切り替えや夏時間からの切り替えを行います。たとえば、標準時間から夏時間への切り替えを 3 月の第 3 日曜日に行うのは、浮動調整規則です。
調整規則をサポートするタイム ゾーンでは、標準時間と夏時間の切り替えの際に、2 種類の異常な時刻、つまり無効な時刻とあいまいな時刻が発生します。無効な時刻とは、標準時間から夏時間への切り替えによって発生する、存在しない時刻です。たとえば、ある日の午前 2 時にこの切り替えが発生し、時刻が午前 3 時に変わる場合、午前 2 時から午前 2 時 59 分 59 秒までの間は無効になります。あいまいな時刻とは、1 つのタイム ゾーン内の 2 つの異なる時刻に対応する可能性のある時刻です。このような時刻は、夏時間から標準時間への切り替えによって発生します。たとえば、ある日の午前 2 時にこの切り替えが発生し、時刻が午前 1 時に変わる場合、午前 1 時から午前 1 時 59 分 59 秒までの間は、標準時間または夏時間のどちらとも解釈できます。
タイム ゾーンの用語
次の表では、タイム ゾーンを使用するとき、およびタイム ゾーンに対応するアプリケーションを開発するときによく使用される用語を定義します。
用語 |
定義 |
---|---|
調整規則 |
標準時間から夏時間への切り替え、および夏時間から標準時間への切り替えをいつ行うかを定義する規則。各調整規則には、規則の適用期間を定義する開始日と終了日 (たとえば、1986 年 1 月 1 日から 2006 年 12 月 31 日まで適用される調整規則)、デルタ (調整規則を適用した結果として標準時間から変化する時間数)、および調整の期間中に切り替えを行う特定の日時に関する情報が含まれます。切り替えは、固定規則または浮動規則に従って行うことができます。 |
あいまいな時刻 |
1 つのタイム ゾーン内の 2 つの異なる時刻に対応する可能性のある時刻。このようなことは、あるタイム ゾーンで夏時間から標準時間に移行する際など、クロック時刻を元に戻すときに発生します。たとえば、この切り替えがある日の午前 2 時に発生し、時刻が午前 1 時に変わる場合、午前 1 時から午前 1 時 59 分 59 秒までの間は、標準時間または夏時間のどちらとも解釈できます。 |
固定規則 |
夏時間への切り替えまたは夏時間からの切り替えを特定の日付に設定する調整規則。たとえば、夏時間から標準時間への切り替えを毎年 10 月 25 日に行うのは、固定調整規則です。 |
可変規則 |
夏時間への切り替えまたは夏時間からの切り替えを、特定の月の特定の週の特定の曜日に設定する調整規則。たとえば、標準時間から夏時間への切り替えを、3 月の第 3 日曜日に行うのは、浮動調整規則です。 |
無効な時刻 |
標準時間から夏時間への切り替えによって発生する、存在しない時刻。このようなことは、あるタイム ゾーンで標準時間から夏時間に移行する際など、クロック時刻を先に進めるときに発生します。たとえば、この切り替えがある日の午前 2 時に発生し、時刻が午前 3 時に変わる場合、午前 2 時から午前 2 時 59 分 59 秒までの間は無効です。 |
切り替え時間 |
特定のタイム ゾーンで実施される夏時間と標準時間との間の切り替えなど、特定の時間切り替えに関する情報。 |
タイム ゾーンと TimeZoneInfo クラス
.NET Framework では、TimeZoneInfo オブジェクトがタイム ゾーンを表します。TimeZoneInfo クラスに含まれる GetAdjustmentRules メソッドは、TimeZoneInfo.AdjustmentRule オブジェクトの配列を返します。この配列の各要素は、特定の期間における夏時間の切り替えに関する情報を提供します (夏時間をサポートしないタイム ゾーンの場合、メソッドは空の配列を返します)。各 TimeZoneInfo.AdjustmentRule オブジェクトには DaylightTransitionStart プロパティと DaylightTransitionEnd プロパティがあり、夏時間への切り替えおよび夏時間からの切り替えを行う特定の日時を定義します。IsFixedDateRule プロパティは、切り替えが固定か浮動かを示します。
.NET Framework は、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 を使用し、指定したあるタイム ゾーンの時刻を、指定した別のタイム ゾーンの時刻に変換します。
タイム ゾーン間での時刻の変換の詳細については、「タイム ゾーン間での時刻の変換」を参照してください。