TimeZoneInfo クラスを使用すると、タイム ゾーン対応アプリケーションの作成が簡略化されます。 TimeZone クラスは、ローカル タイム ゾーンと協定世界時 (UTC) の操作をサポートしています。 TimeZoneInfo クラスは、これらのゾーンと、レジストリで定義済みの情報に関するタイム ゾーンの両方をサポートします。 TimeZoneInfoを使用して、システムに情報がないカスタム タイム ゾーンを定義することもできます。
タイム ゾーンの要点
タイム ゾーンは、同じ時間が使用される地理的リージョンです。 通常、隣接するタイム ゾーンは 1 時間離れていますが、必ずしもではありません。 世界のいずれかのタイム ゾーンの時刻は、協定世界時 (UTC) からのオフセットとして表すことができます。
世界のタイム ゾーンの多くは、夏時間をサポートしています。 夏時間制度は、春または初夏に時計を1時間進め、夏の終わりや秋に通常時間に戻すことで、日中の明るい時間を最大化しようとします。 標準時との間のこれらの変更は、調整ルールと呼ばれます。
特定のタイム ゾーンの夏時間との間の切り替えは、固定またはフローティング調整規則によって定義できます。 固定調整規則では、夏時間の切り替えが毎年行われる特定の日付を設定します。 たとえば、夏時間から 10 月 25 日に毎年発生する標準時への移行は、固定の調整規則に従います。 最も一般的なのが、夏時間への切り替えまたは夏時間からの切り替えに、特定の月の特定の週の特定の日を設定するフローティング調整ルールです。 たとえば、3 月の第 3 日曜日に発生する標準時から夏時間への移行は、フローティング調整規則に従います。
調整規則をサポートするタイム ゾーンの場合、夏時間との間の切り替えにより、無効な時刻とあいまいな時刻の 2 種類の異常な時刻が作成されます。 無効な時刻は、標準時から夏時間への切り替えによって作成された存在しない時刻です。 たとえば、この遷移が特定の日の午前 2 時 00 分に発生し、時刻が午前 3 時に変更される場合、午前 2 時から午前 2 時 59 分 59 分までの各時間間隔は無効です。 あいまいな時刻は、1 つのタイム ゾーンで 2 つの異なる時刻にマップできる時刻です。 夏時間から標準時への移行によって作成されます。 たとえば、この遷移が特定の日の午前 2 時 00 分に発生し、時刻が午前 1 時に変更される場合、午前 1 時から午前 1 時 59 分 59 分までの各時間間隔は、標準時または夏時間として解釈できます。
タイム ゾーンの用語
次の表では、タイム ゾーンを操作し、タイム ゾーン対応アプリケーションを開発するときによく使用される用語を定義します。
任期 | 定義 |
---|---|
調整ルール | 標準時から夏時間への切り替えと夏時間から標準時への切り替えがいつ発生するかを定義するルール。 各調整規則には開始日と終了日があり、ルールが配置されるタイミング (たとえば、調整規則が 1986 年 1 月 1 日から 2006 年 12 月 31 日まで)、差分 (調整ルールの適用の結果として標準時間が変化する時間)、および調整期間中に遷移が行われる特定の日付と時刻に関する情報が含まれます。 遷移は、固定ルールまたは浮動ルールのいずれかに従うことができます。 |
あいまいな時刻 | 1 つのタイム ゾーンで 2 つの異なる時刻にマップできる時刻。 タイム ゾーンの夏時間から標準時への切り替え中など、時刻に合わせてクロック時間が調整されるときに発生します。 たとえば、この遷移が特定の日の午前 2 時 00 分に発生し、時刻が午前 1 時に変更される場合、午前 1 時から午前 1 時 59 分 59 分までの各時間間隔は、標準時または夏時間として解釈できます。 |
固定ルール | 夏時間との間の切り替えの特定の日付を設定する調整規則。 たとえば、夏時間から 10 月 25 日に毎年発生する標準時への移行は、固定の調整規則に従います。 |
浮動ルール | 夏時間との間の切り替えに、特定の月の特定の週の特定の日を設定する調整規則。 たとえば、3 月の第 3 日曜日に発生する標準時から夏時間への移行は、フローティング調整規則に従います。 |
無効な時刻 | 標準時から夏時間への移行の成果物である存在しない時刻。 タイム ゾーンの標準時から夏時間への切り替え中など、クロック時間が時間単位で調整されるときに発生します。 たとえば、この遷移が特定の日の午前 2 時 00 分に発生し、時刻が午前 3 時に変更される場合、午前 2 時から午前 2 時 59 分 59 分までの各時間間隔は無効です。 |
移行時間 | 特定のタイム ゾーンでの夏時間から標準時への変更、またはその逆など、特定の時刻の変更に関する情報。 |
タイム ゾーンと TimeZoneInfo クラス
.NET では、 TimeZoneInfo オブジェクトはタイム ゾーンを表します。 TimeZoneInfo クラスには、GetAdjustmentRules オブジェクトの配列を返すTimeZoneInfo.AdjustmentRule メソッドが含まれています。 この配列の各要素は、特定の期間の夏時間との間の切り替えに関する情報を提供します。 (夏時間をサポートしていないタイム ゾーンの場合、メソッドは空の配列を返します)。各 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: 1 つの指定されたタイム ゾーンの時刻を、別の指定されたタイム ゾーンの時刻に変換します。
ConvertTimeBySystemTimeZoneId:パラメーターとしてタイム ゾーン識別子 ( TimeZoneInfo オブジェクトではなく) を使用して、指定されたタイム ゾーンの時刻を別の指定されたタイム ゾーンの時刻に変換します。
タイム ゾーン間の時刻の変換の詳細については、「タイム ゾーン 間の時刻の変換」を参照してください。
こちらも参照ください
.NET