DST を含む日付と時刻を処理する

この記事では、夏時間 (DST) と DST 2007 の変更が特定の製品とテクノロジに及ぼす影響を含む日付と時刻を処理する方法について説明します。

元の製品バージョン: Windows
元の KB 番号: 932955

概要

日付と時刻を処理するアプリケーションを記述する開発者は、日付操作と時刻操作を実行する 1 つ以上のテクノロジを使用できます。 特に、特定の基本オペレーティング システム API、C ランタイム (CRT)、および Microsoft .NET Frameworkは、日付と時刻を変換または操作できます。 この記事では、日付と時刻の処理に関連する一般的な概念について説明します。

時間の保存と操作

タイムスタンプは、日付と時刻の組み合わせを指定する値です。 タイムスタンプを処理する必要があるアプリケーションでは、通常、それらのタイムスタンプが世界協定時刻 (UTC) に格納されます。 UTC の利点は、UTC がユニバーサルである点です。 UTC は、ローカル タイム ゾーンまたは DST の対象ではありません。 ただし、UTC はユーザーフレンドリでも、ほとんどのユーザーに関連していません。 UTC はストレージの明確な選択ですが、表示には適していません。 そのため、ほとんどのアプリケーションでは、ユーザーにタイムスタンプを表示する前に UTC 時刻をローカル時刻に変換します。 たとえば、Windows エクスプローラーでは、新しいテクノロジ ファイル システム (NTFS) ディレクトリ内のファイルの日付と時刻が表示される前に、タイム ゾーンと DST 設定が UTC タイムスタンプに適用されます。

UTC 時刻から現地時刻への変換は、2 つのオフセットを適用すると考えることができます。 1 つ目はタイム ゾーン オフセット、2 つ目は DST オフセットです。 したがって、ローカル時刻は実質的に UTC 時刻にタイム ゾーン オフセットと適用可能な DST オフセットを加えたものです。 タイム ゾーン オフセットはかなり簡単です。 コンピューターは特定のタイム ゾーン用に構成されており、そのタイム ゾーンには UTC からのオフセットがあります。 DST オフセットを適用する必要があるかどうかを判断する方がはるかに複雑です。 このアクティビティは、複雑で動的な多くのルールに依存しています。

これらの複雑な DST 規則は、DST 2007 で最近変更されました。 2007 年から、米国では DST の新しい開始日と新しい終了日が採用されました。 さらに、他の国/地域や政府では、管理下にあるタイム ゾーンの DST の開始日と終了日を定期的に変更するのが一般的です。 次のセクションでは、DST 2007 の変更が開発者関連製品に及ぼす影響について説明します。

DST 2007 の詳細については、「 夏時間のヘルプとサポート」を参照してください。

Windows での DST 2007 効果

Windows Updateおよび Microsoft Update では、DST 2007 および以降の年の変更を Windows が正しく適用できるようにする更新プログラムを使用できます。 これらの更新プログラムが適用されると、コンピューターが DST を通過する際に、UTC 時刻から現地時刻までの現在のオフセットが正しく計算されます。 オフセットには、基本 API とネットワーク時間関連 API のオフセットが含まれます。

詳細については、「 Windows オペレーティング システムの 2007 年 12 月の累積的なタイム ゾーン更新プログラム」を参照してください。

C ランタイム (CRT) に対する DST 2007 の影響

CRT では、日付変換と時刻変換も実行されます。 そのため、DST 2007 の新しい規則を含むように CRT も更新する必要があります。 CRT は、TZ 環境変数が設定されている場合、または基になるオペレーティング システム API の時間呼び出しが失敗した場合にのみ、独自の時間処理を実行します。 更新は、Visual Studio の各バージョンに含まれている CRT と、Windows に含まれる CRT にも使用できます。 これらの更新により、CRT は米国タイム ゾーンでの DST 変換を引き続き正しく処理できます。

.NET FRAMEWORKに対する DST 2007 の影響

.NET Frameworkは、基になるオペレーティング システムの呼び出しに依存します。 したがって、.NET Frameworkの動作は、基になるオペレーティング システムの状態を反映します。 個別の更新は必要ありません。

Visual Studio .NET IDE に対する DST 2007 の効果

Visual Studio .NET 統合開発環境 (IDE) には、Visual C++、Visual C#、Visual Basic のバージョン 2002、2003、および 2005 が含まれています。 これらの製品は、CRT が含まれているためにのみ影響を受ける。 IDE 固有の更新は必要ありません。

Visual Studio 2005 Team Foundation Server での DST 2007 の効果

Visual Studio 2005 Team Foundation Server は、日付と時刻の変換に基づくオペレーティング システムに依存しています。 そのため、Visual Studio 2005 Team Foundation Server はオペレーティング システムと同じ動作を示します。 Visual Studio 2005 Team Foundation Server は、SQL Server、SQL Server Reporting Services、Windows SharePoint Servicesにも依存しています。 コンピューターは、オペレーティング システム、SQL Server、およびWindows SharePoint Servicesに関連する更新プログラムで更新する必要があります。 すべての関連する更新プログラムは、影響を受けるすべてのコンピューターに同時に適用する必要があります。 Visual Studio 2005 Team Foundation Server の個別の更新は必要ありません。

Visual Studio 2005 チーム システムでの DST 2007 の影響

Visual Studio 2005 Team System は、オペレーティング システム、Visual Studio 2005 Team Foundation Server、および CRT を介して影響を受けます。 Visual Studio 2005 チーム システムの個別の更新は必要ありません。

Visual Basic 6.0 ランタイムに対する DST 2007 の影響

Visual Basic 6.0 ランタイムは影響を受けません。

Visual C++ 6.0 での DST 2007 の影響

Visual C++ 6.0 はサポートされなくなりました。 詳細については、「Microsoft ライフサイクル ポリシー」を参照してください。

Windows SDK for Windows Vista での DST 2007 効果

このソフトウェア開発キット (SDK) には、DST 2007 の変更の影響を受ける CRT のバージョンが含まれています。 この SDK のインストールの一環として、そのバージョンの CRT がまだインストールされていないコンピューターに Visual Studio 2005 CRT をインストールできます。 新しいバージョンの CRT が既にインストールされている場合、SDK のインストールによってその新しいバージョンが上書きされることはありません。 SDK がアンインストールされると、最新バージョンの CRT がコンピューターに残ります。 SDK をインストールする前または後に、Visual Studio 2005 CRT 更新プログラムをインストールできます。

Windows SDK for Windows Vista では、カスタム C++ アプリケーションの一部として CRT を再配布するために、Visual Studio 2005 CRT 用の一連のマージ モジュール (.msm ファイル) もインストールされます。 再頒布可能 CRT をアプリケーションのインストール フォルダーに展開するアプリケーションでは、Windows SDK for Windows Vista の CRT .msm ファイルではなく、Visual Studio 2005 CRT 更新プログラムから更新された CRT を展開する必要があります。 Windows インストール フォルダーに再頒布可能な Visual Studio 2005 CRT 更新プログラムを展開するアプリケーションは、これらのコンピューターに Visual Studio 2005 CRT 再頒布可能更新プログラムを適用する必要があります。

Windows Server 2003 R2 用プラットフォーム SDK に対する DST 2007 の影響

この SDK には、DST 2007 の変更の影響を受ける CRT のバージョンが含まれています。 お客様は、この SDK のリリース ノートに従い、必要に応じて Visual Studio 2005 CRT 更新プログラムを使用する必要があります。

.NET Framework 2.0 SDK に対する DST 2007 の影響

この SDK には、DST 2007 の変更の影響を受ける CRT のバージョンが含まれています。 この SDK のインストールの一環として、そのバージョンの CRT がまだインストールされていないコンピューターに Visual Studio 2005 CRT をインストールできます。 新しいバージョンの CRT が既にインストールされている場合、SDK のインストールによってその新しいバージョンが上書きされることはありません。 SDK がアンインストールされると、最新バージョンの CRT がコンピューターに残ります。 SDK をインストールする前または後に、Visual Studio 2005 CRT 更新プログラムをインストールできます。

Windows でのローカル時刻変換

アプリケーションは通常、時刻情報と日付情報をユーザーに表示する前に、UTC 時刻をローカル時刻に変換します。 Windows には、タイムスタンプ操作に使用するアプリケーション用の API がいくつか用意されています。

  • 関数と関数は GetSystemTime()GetSystemTimeAsFileTime() 構造体または構造体の現在の SYSTEMTIME UTC 時刻を FILETIME 取得します。

  • 関数は GetLocalTime() 、構造体の現在のローカル時刻を SYSTEMTIME 取得します。

  • 関数は GetTimeZoneInformation() 、コンピューターの TIME_ZONE_INFORMATION 現在のタイム ゾーンと DST 設定を記述する構造体を取得します。

  • 関数と関数はSystemTimeToFileTime()、構造体とFILETIME構造体の間SYSTEMTIMEでマーFileTimeToSystemTime()シャリングされます。

  • 関数と関数は FileTimeToLocalFileTime() 、現在の LocalFileTimeToFileTime() タイム ゾーンとコンピューターの FILETIME DST 設定を使用して、UTC とローカル時刻の間で構造体を変換および変換します。

  • 関数と関数は SystemTimeToTzSpecificLocalTime()TzSpecificTimeToSystemTime() 構造体の UTC タイムスタンプを SYSTEMTIME ローカル SYSTEMTIME 構造体に変換します。 これらの関数は、DST の TIME_ZONE_INFORMATION 開始日と終了日を指定する構造体を使用します。 既定では、このような構造が指定されていない場合は、現在の DST 規則が使用されます。

  • 関数は NetRemoteTOD() 、サーバーの情報と設定を使用して、リモート サーバーから時刻を取得します。

注:

関数と関数は FileTimeToLocalFileTime() 、現在の LocalFileTimeToFileTime() タイム ゾーン情報と DST 情報のみを使用して、UTC 時刻と現地時刻の間の変換を実行します。 この変換は、変換されるタイムスタンプに関係なく発生します。

Windows エクスプローラーでこの動作の例を確認するには、DST を使用するタイム ゾーンに存在するコンピューターで次の手順を実行します。

これらの手順では、システム クロックを変更する必要があります。 そのため、これらの手順に従う前に、これらの時刻の変更に対応する可能性があるアプリケーション (予定表アプリケーションなど) を終了する必要があります。

  1. コンピューターの日付を DST 日に変更します。 たとえば、日付を 2006 年 7 月 1 日に設定します。
  2. 同じコンピューター上の NTFS ディレクトリで、Test.txt という名前の新しいテキスト ファイルを作成します。
  3. Windows エクスプローラーでは、ファイルのタイムスタンプが次のように表示されます。
    2006/7/1 午後 3:37
  4. コンピューターの日付を DST 以外の日に変更します。 たとえば、日付を 2007 年 2 月 1 日に設定します。
  5. [Windows エクスプローラー] ウィンドウを更新します。
  6. Windows エクスプローラーでは、ファイルのタイムスタンプが次のように表示されます。
    2006/7/1 午後 2:37

この前の例では、ファイルの UTC タイムスタンプは変更されません。 ただし、タイムスタンプをローカル時刻に変換するために使用される規則は、コンピューター上の現在の日付によって変わります。 手順 3 では、7 月 1 日が DST 範囲内にあるため、DST オフセットが適用されました。 手順 6 では、2 月 1 日が DST 範囲に収まらないため、DST オフセットは適用されませんでした。 この動作は、ファイル のタイムスタンプを確定的にローカル時刻とローカル時刻に変換できるように発生します。

メソッドと メソッドはSystemTimeToTzSpecificLocalTime()、指定TIME_ZONE_INFORMATIONされたTzSpecificTimeToSystemTime()構造体を使用して UTC 時刻と現地時刻の間で変換します。 タイム ゾーン情報が指定されていない場合、これらの関数は現在のタイム ゾーン規則と DST 規則を使用して、DST オフセットをタイムスタンプに適用する必要があるかどうかを判断します。 これは、現在有効な構造体を GetTimeZoneInformation() 取得するために メソッドを TIME_ZONE_INFORMATION 呼び出すことと機能的に同等です。

構造には TIME_ZONE_INFORMATION 、DST の開始日と終了日が含まれます。 したがって、構造体が現在の TIME_ZONE_INFORMATION タイム ゾーン情報を使用する場合、構造体によって TIME_ZONE_INFORMATION 履歴の不正確さが発生する可能性があります。 この動作は、現在のタイム ゾーン情報と DST 情報に変換されているタイムスタンプが反映されていない場合に発生する可能性があります。 この動作は DST 2007 の影響を受けます。これは、DST が開始および停止する日付を管理する規則が変更されたためです。

これらの関数から歴史的に正確な変換を取得するには、アプリケーションがこれらの関数を呼び出すときに、歴史的に正確な TIME_ZONE_INFORMATION 構造を提供する必要があります。

Windows の動的タイム ゾーン

Windows Vista では、動的 DST タイム ゾーンが導入されています。 動的 DST は、DST の境界が年ごとに変化するタイム ゾーンをサポートします。 これらの規則はレジストリに格納されます。 アプリケーションは、 関数を使用してルールに対してクエリを GetDynamicTimeZoneInformation() 実行できます。

動的タイム ゾーンを使用すると、特に年単位の DST 境界が事前にわかっているロケールでは、コンピューターの更新が容易になります。 Windows SDK for Vista の DYNAMIC_TIME_ZONE_INFORMATION 構造の詳細については、「 DYNAMIC_TIME_ZONE_INFORMATION構造体」を参照してください。

C ランタイム (CRT) でのローカル時刻変換

CRT には基本的に、タイムスタンプを変換できる 3 つのモードがあります。

  • TZ 環境変数が設定されていない場合、CRT は Windows API を呼び出し、この記事で説明するように Windows の動作を示します。

  • TZ 環境変数が設定されている場合、CRT はその設定に基づいて独自の変換を実行します。 CRT は、このシナリオで変換を実行するときに新しい DST 2007 規則を尊重するように更新されています。

  • TZ 環境変数が設定されていないが、基になる Windows API が失敗した場合、CRT は TZ 環境変数に PST8PDT の値を使用して、独自の変換にフォールバックします。

CRT には、UTC をローカル時刻に変換するための独自のロジックが含まれています。 アプリケーションは、関数などの関数から UTC タイムスタンプを time() 取得できます。 これらの UTC タイムスタンプは値に time_t 格納されます。 ローカル時刻への変換は、 関数などの関数を使用して localtime_s() 実行できます。 関数は localtime_s()tm ヘッダー ファイルで定義されている構造体を Time.h 設定します。 構造体は tm 、TZ 環境変数で定義されているタイム ゾーンと、タイムスタンプの時点で有効な DST 規則に基づいています。

注:

この変換は、米国に固有の規則に従います。

DST 2007 更新プログラムを適用する前に、CRT は米国タイム ゾーンの現在のタイムスタンプを正しく処理します。 DST 2007 更新プログラムを適用した後、CRT は過去と将来の米国の両方の日付も処理します。 CRT の更新は、[参照] セクションに一覧表示されます。

.NET Frameworkでの現地時刻変換

.NET Frameworkには、タイムスタンプを格納および変換するクラスが含まれています。 これらのクラスには、 DateTime クラス、 TimeZone クラス、 TimeSpan クラス、および クラスが DateTimeKind 含まれます。 前に説明したように、これらのクラスは主に基になるプラットフォームの実装に依存します。 これらのクラスは、基になるオペレーティング システム API と同じ動作を示します。

.NET Frameworkの日付クラスと時刻クラスによって示される興味深い動作の 1 つは、要求された量でタイムスタンプをオフセットする関数に関連しています。 たとえば、 クラスの AddHours() 関数、 AddMinutes() 関数、および AddSeconds() 関数を DateTime 考えてみましょう。 これらの関数と同様の名前の関数は、DST 設定に関係なく、要求された量だけタイムスタンプをインクリメントするだけです。 この動作は、基になる UTC タイムスタンプの単純な算術演算と見なされる場合があります。 ただし、この動作により、追加によってタイムスタンプが DST に渡されたり、DST から送信されたりすると、予期しない結果が発生する可能性があります。 この動作は、DST 2007 の変更とは無関係です。

推奨事項

次の推奨事項は、開発者が DST 2007 の影響を最小限に抑え、一般的な日付と時刻の処理を向上させるのに役立ちます。

  • DST 2007 更新プログラムのほぼアトミックインストールを計画する必要があります。 予定されているすべての DST 2007 更新プログラムは、可能な限り相互に近い時間で適用する必要があります。 更新されたコンピューターが、SQL クエリや Web サービスなどのメソッドを使用して、更新されていないコンピューターと通信しようとすると、翻訳エラーが発生する可能性があります。 同様に、1 台のコンピューターで Windows 更新プログラムや CRT 更新プログラムなど、2 つ以上の更新プログラムが必要な場合は、更新プログラムを同時に適用する必要があります。

  • UTC タイムスタンプは歴史的に正確です。 通常、ほとんどのアプリケーションに関係するローカル時刻への変換です。 アプリケーションは常に UTC タイムスタンプを格納する必要があります。 表示目的でローカル時刻に変換するには、タイム ゾーン情報と DST 情報が必要です。 この情報は、次のいくつかのソースから取得できます。

    • アプリケーションでは、変換に現在のタイム ゾーンと DST 設定を使用できます。 現在のタイム ゾーンと DST 設定がタイムスタンプの時点で有効でなかった場合、変換に不正確さが生じる可能性があります。

    • アプリケーションは、UTC タイムスタンプに加えて、以前に正確なタイム ゾーン情報と DST 情報を格納できます。

    • 動的タイム ゾーンを使用できる場合、アプリケーションは動的タイム ゾーンを使用して、特定の UTC タイムスタンプに適用するタイム ゾーン情報を決定できます。 このオプションは、特定のタイムスタンプと特定のタイム ゾーンに対して動的タイム ゾーン情報を使用できる場合にのみ使用できます。

    • アプリケーションには、ローカル タイムスタンプと UTC タイムスタンプが格納される場合があります。 このメソッドを使用すると、将来の変換が不要になります。

  • タイムスタンプを処理するコンピューター間の通信では、UTC タイムスタンプを使用する必要があります。 これにより、両方のコンピューターに UTC の同じコンテキスト情報が暗黙的に提供されます。

  • アプリケーションが日付を処理する場合は、テストで日付を処理する方法に注意する必要があります。 時刻情報なしで表示される日付は、通常、関連する日付の午前 12:00 のタイムスタンプとして格納されます。 したがって、タイムスタンプの時間部分で 1 回ずつエラーが発生すると、時刻が前日の午後 11 時にシフトした場合に有効な日付が 1 つずつオフになる可能性があります。

関連情報