DST を含む日付と時刻の処理方法

文書翻訳 文書翻訳
文書番号: 932955 - 対象製品
すべて展開する | すべて折りたたむ

目次

はじめに

開発者が日付および時刻を処理するアプリケーションを記述する際に、日付操作および時刻操作を行う 1 つまたは複数のテクノロジを使用する場合があります。具体的には、特定の基本オペレーティング システム API、C ランタイム (CRT)、および Microsoft .NET Framework で、日付および時刻の変換や操作を行うことができます。この資料では、日付および時刻の処理に関するいくつかの一般的な概念ついて説明します。また、2007 年の夏時間 (DST) 変更が特定の製品およびテクノロジに与える影響についても説明します。

詳細

時刻の保存と操作

タイムスタンプは、日付と時刻の組み合わせを指定する値です。タイムスタンプを処理する必要があるアプリケーションは、通常、タイムスタンプを世界協定時刻 (UTC) で保存します。UTC の利点は、世界共通であることです。UTC では、ローカル タイム ゾーンまたは DST の制約を受けません。ただし、UTC はユーザーが使用しやすいものではなく、ほとんどのユーザーにとって適切ではありません。UTC は保存に最適な形式ですが、表示には適しません。そのため、ほとんどのアプリケーションでは、UTC 時間をローカル時間に変換してからタイムスタンプを表示しています。たとえば、エクスプローラでは、タイム ゾーンと DST 設定を UTC 形式のタイムスタンプに適用してから Windows NT ファイル システム (NTFS) ディレクトリのファイルの日付と時刻を表示しています。

UTC 時間からローカル時間への変換は、2 つのオフセットの適用と考えることができます。1 つ目はタイム ゾーン オフセットであり、2 つ目は DST オフセットです。そのため、ローカル時間は事実上、UTC 時間に、タイム ゾーン オフセットおよび適切な DST オフセットを加えたものです。タイム ゾーン オフセットは非常にわかりやすいオフセットです。コンピュータは特定のタイム ゾーンを使用するように構成されますが、そのタイム ゾーンには UTC からのオフセットが含まれています。DTS オフセットを適用する必要があるかどうかを判断することは、これによりもはるかに複雑です。この判断は、複雑かつ動的な多数の規則に依存しているためです。

そのような複雑な DST 規則が、最近 DST 2007 として変更されました。2007 年より、米国では DST の開始日と終了日が新しい日付に変更されました。さらに、その他の国や政府でも、管理下の各タイム ゾーンにおける DST の開始日と終了日を定期的に変更するのはよくあることです。以下では、2007 年の DST 変更が開発関連の製品に与える影響について説明します。

2007 年の DST 変更の詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/gp/cp_dst

2007 年の DST 変更による開発関連のテクノロジへの影響

Windows

Windows Update および Microsoft Update では、2007 年以降の DST に対する変更を正しく適用できるようにする更新プログラムを提供します。これらの更新プログラムを適用すると、DST への移行があっても UTC とローカル時間の現在のオフセットが正しく計算されます。このオフセットには、基本 API およびネットワークの時刻関連の API のオフセットが含まれます。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
931836 Microsoft Windows オペレーティング システム用の 2007 年 2 月の累積的なタイム ゾーン更新プログラム

C ランタイム (CRT)

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

.NET Framework

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

Visual Studio .NET 統合開発環境 (IDE)

Visual Studio .NET IDE には、2002、2003、および 2005 のバージョンの Microsoft Visual C++、Microsoft Visual C#、および Microsoft Visual Basic が含まれています。これらの製品が影響を受けるのは、CRT が含まれているからにすぎません。IDE 自体を更新する必要はありません。

Visual Studio 2005 Team Foundation Server

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

Visual Studio 2005 Team System

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

Visual SourceSafe

2007 年の DST に関する Visual SourceSafe の問題の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
931804 Visual SourceSafe における 2007 年の夏時間変更の問題

Visual Basic 6.0 ランタイム

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

Visual C++ 6.0

Visual C++ 6.0 は、現在はサポートされていません。

詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/lifecycle/

Windows Vista 用の Windows ソフトウェア開発キット (SDK)

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

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

Microsoft Windows Server 2003 R2 用のプラットフォーム SDK

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

.NET Framework 2.0 SDK

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

Windows におけるローカル時間の変換

通常、アプリケーションでは、UTC 時間をローカル時間に変換してから、時刻および日付の情報を表示します。Windows には、アプリケーションでタイムスタンプの操作に使用できる API が用意されています。
  • GetSystemTime() 関数および GetSystemTimeAsFileTime() 関数は、SYSTEMTIME 構造体または FILETIME 構造体から現在の UTC 時間を取得します。
  • GetLocalTime() 関数は、SYSTEMTIME 構造体から現在のローカル時間を取得します。
  • GetTimeZoneInformation() 関数は、コンピュータの現在のタイム ゾーンと DST 設定が記述されている TIME_ZONE_INFORMATION 構造体を取得します。
  • SystemTimeToFileTime() 関数および FileTimeToSystemTime() 関数は、SYSTEMTIME 構造体と FILETIME 構造体の間でマーシャリングを行います。
  • FileTimeToLocalFileTime() 関数および LocalFileTimeToFileTime() 関数は、コンピュータの現在のタイム ゾーンと DST 設定を使用して、FILETIME 構造体を UTC またはローカル時間に変換します。
  • SystemTimeToTzSpecificLocalTime() 関数および TzSpecificTimeToSystemTime() 関数は、SYSTEMTIME 構造体に格納されている UTC 形式のタイムスタンプをローカル時間に変換し、指定した SYSTEMTIME 構造体に格納します。この関数は、DST の開始日と終了日を指定する TIME_ZONE_INFORMATION 構造体を使用します。TIME_ZONE_INFORMATION 構造体を指定しない場合、デフォルトでは現在の DST 規則が使用されます。
  • NetRemoteTOD() 関数は、リモート サーバーの情報と設定を使用して、そのリモート サーバーの時刻を取得します。
: FileTimeToLocalFileTime() 関数および LocalFileTimeToFileTime() 関数は、現在のタイム ゾーン情報と DST 情報のみを使用して UTC 時間とローカル時間との間の変換を行います。この変換は、変換されるタイム スタンプとは無関係に行われます。

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

次の手順では、システム時計を変更する必要があります。そのため、次の手順を実行する前に、予定表管理アプリケーションなどの、時刻変更が反映される可能性があるすべてのアプリケーションを終了する必要があります。
  1. コンピュータの日付を DST が使用される日付に変更します。たとえば、2006 年 7 月 1 日に設定します。
  2. 同じコンピュータの NTFS ディレクトリに、Test.txt という名前の新しいテキスト ファイルを作成します。
  3. このファイルのタイムスタンプが次のようにエクスプローラに表示されます。
    2006/07/01 15:37
  4. コンピュータの日付を DST が使用されない日付に変更します。たとえば、2007 年 2 月 1 日に設定します。
  5. エクスプローラの表示を更新します。
  6. このファイルのタイムスタンプが次のようにエクスプローラに表示されます。
    2006/07/01 14:37
上記の例では、ファイルの UTC 形式のタイムスタンプは変更されません。ただし、タイムスタンプをローカル時間に変換する際に使用される規則は、コンピュータの現在の日付に合わせて変更されます。手順 3. では、7 月 1 日は DST 期間に含まれるため、DST オフセットが適用されました。手順 6. では、2 月 1 日は DST 期間に含まれないため、DST オフセットが適用されませんでした。ファイルのタイムスタンプをローカル時間から、またはローカル時間へ確定的に変換できるように、このような動作になっています。

詳細については、次のマイクロソフト Web サイトを参照してください。
http://blogs.msdn.com/oldnewthing/archive/2003/10/24/55413.aspx
SystemTimeToTzSpecificLocalTime() 関数および TzSpecificTimeToSystemTime() 関数は、指定された TIME_ZONE_INFORMATION 構造体を使用して UTC 時間とローカル時間との間の変換を行います。タイム ゾーン情報を指定しない場合、これらの関数では現在のタイム ゾーン規則と DST 規則を使用して、DST オフセットをタイムスタンプに適用する必要があるかどうかを判定します。この機能は、GetTimeZoneInformation() 関数を呼び出して、現在有効な TIME_ZONE_INFORMATION 構造体を取得することに相当します。

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

これらの関数を使用して履歴情報が適切になる変換を行うには、アプリケーションでこれらの関数を呼び出すときに、正確な履歴情報を持つ TIME_ZONE_INFORMATION 構造体を指定する必要があります。

Windows における動的なタイム ゾーン

Windows Vista には動的な DST タイム ゾーンが導入されています。動的な DST では、DST の開始日および終了日が毎年変更されるタイム ゾーンがサポートされます。これらの規則はレジストリに保存されます。アプリケーションでは、GetDynamicTimeZoneInformation() 関数を使用してそれらの規則を問い合わせることができます。

動的なタイム ゾーンを使用すると、特に、毎年の DST の開始日と終了日が事前にわかるロケールの場合には、コンピュータの更新が簡単になります。Vista 用の Windows SDK における DYNAMIC_TIME_ZONE_INFORMATION 構造体の詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
http://msdn2.microsoft.com/en-us/library/ms724253.aspx

C ランタイム (CRT) におけるローカル時間の変換

CRT には、基本的に、タイムスタンプを変換できるモードが 3 つあります。
  • TZ 環境変数を設定していない場合、CRT は Windows API を呼び出し、この資料に記載されている Windows の動作と同じ動作になります。
  • TZ 環境変数を設定した場合、CRT は設定内容に基づいて独自の変換を行います。この状況で変換を行う場合、CRT は新しい DST 2007 規則に従うように更新されます。
  • TZ 環境変数が設定されておらず、Windows API の呼び出しが失敗した場合、CRT は TZ 環境変数に値 PST8PDT を設定して、独自の変換を行います。
CRT には、UTC 時間をローカル時間に変換するための独自のロジックが含まれています。アプリケーションは、time() などの関数から UTC 形式のタイムスタンプを取得できます。この UTC 形式のタイムスタンプは time_t 値に格納されます。ローカル時間への変換は、localtime_s() などの関数を使用して実行できます。localtime_s() 関数は、Time.h ヘッダー ファイルで定義されている tm 構造体に値を設定します。この tm 構造体は、TZ 環境変数で定義されているタイム ゾーンと、タイムスタンプ日時に有効になっている DST 規則に基づきます。

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

DST 2007 更新プログラムの適用前は、CRT で米国のタイム ゾーンの現在のタイムスタンプが正しく処理されます。DST 2007 更新プログラムの適用後は、米国の過去と将来の両方の日付が正しく処理されるようになります。CRT の更新プログラムは、「関連情報」に記載されています。

.NET Framework におけるローカル時間の変換

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

.NET Framework の日付クラスおよび時刻クラスの動作で注目すべきは、タイムスタンプに対して指定された時間量のオフセットを加算する関数に関するものです。たとえば、DateTime クラスの AddHours() 関数、AddMinutes() 関数、および AddSeconds() 関数を考えます。これらの関数および同様の名前を持つ関数では、タイムスタンプに対して指定された時間量を単純に加算し、DST の設定は考慮されません。この処理は、UTC 形式のタイムスタンプに基づく単純な計算処理と見なすこともできます。しかし、タイムスタンプに時間を加算したことにより、タイムスタンプが DST 開始日時または終了日時をまたいだ場合、この計算処理により予期しない計算結果が返される可能性があります。この動作は 2007 年の DST 変更とは無関係です。

推奨事項

開発者が 2007 年の DST 変更の影響を最小限に抑え、一般的な日付と時刻の処理を向上させるには、次の推奨事項が役立ちます。
  • DST 2007 更新プログラムのインストールを、ほぼ自動化することを検討する必要があります。また、適用予定のすべての DST 2007 更新プログラムは、できる限り間を空けずに適用する必要があります。更新済みのコンピュータで、SQL クエリまたは Web サービスなどの方法を使用して、更新されていないコンピュータと通信しようとすると、変換エラーが発生する場合があります。同様に、Windows の更新プログラムと CRT の更新プログラムなど、1 台のコンピュータに 2 つ以上の更新プログラムを適用する必要がある場合は、それらの更新プログラムを一度に適用する必要があります。
  • UTC 形式のタイムスタンプによる履歴情報は正確です。ほとんどのアプリケーションで問題となるのは、通常、ローカル時間への変換です。アプリケーションでは、必ず UTC 形式でタイムスタンプを保存する必要があります。表示を目的としたローカル時間への変換には、タイム ゾーン情報と DST 情報が必要です。この情報の入手元は、複数あります。
    • 変換のために、アプリケーションで現在のタイム ゾーンと DST 設定を使用する場合があります。この場合、タイムスタンプの時刻に現在のタイム ゾーンと DST 設定が有効になっていないと、変換で不整合が生じることがあります。
    • アプリケーションで、UTC 形式のタイムスタンプ以外に、正確なタイム ゾーン情報と DST 情報をあらかじめ保存しておくことができます。
    • 動的なタイム ゾーンを使用できる場合、アプリケーションでは、動的なタイム ゾーンを使用して、特定の UTC 形式のタイムスタンプに対して適用すべきタイム ゾーン情報を特定できます。特定のタイムスタンプおよび特定のタイム ゾーンに対して動的なタイム ゾーン情報を使用できる場合にのみこの方法を使用できます。
    • アプリケーションで、ローカルのタイムスタンプと UTC 形式のタイムスタンプを保存しておくことができます。この方法を使用した場合、その後の変換は不要です。
  • タイムスタンプを処理するコンピュータ間の通信には、UTC 形式のタイムスタンプを使用する必要があります。これにより、両方のコンピュータに、同じ UTC のコンテキスト情報が暗黙的に提供されます。
  • アプリケーションで日付を処理する場合、テストを行って、日付の処理方法に十分な注意を払う必要があります。時刻情報を伴なわない日付は、通常、その日付の午前 12:00 としてタイムスタンプが保存されます。そのため、タイムスタンプの時刻部分が 1 時間ずれるエラーが発生し、時刻が前日の午後 11:00 に変更された場合、日付自体も 1 日ずれる可能性があります。

関連情報

DST 2007 の関連情報をまとめたマイクロソフトのポータル サイトについては、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/gp/cp_dst
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
931836 Microsoft Windows オペレーティング システム用の 2007 年 2 月の累積的なタイム ゾーン更新プログラム
931975 2007 年の夏時間変更に対する準備を SQL Server 2005 および SQL Server 2000 で行う方法
931804 Visual SourceSafe における 2007 年の夏時間変更の問題
詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
http://msdn.microsoft.com/library/ja/jpsysinf/html/_win32_filetimetolocalfiletime.asp

http://msdn.microsoft.com/library/ja/jpsysinf/html/_win32_localfiletimetofiletime.asp

http://msdn.microsoft.com/library/ja/jpsysinf/html/Toppage_Time.asp
C ラインタイム (CRT) の DST 2007 更新プログラムを入手するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
932305 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2002 C ランタイムの 2007 年夏時間変更の更新プログラム
932304 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2002 Service Pack 1 C ランタイムの 2007 年夏時間変更の更新プログラム
932299 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2003 C ランタイムの 2007 年夏時間変更の更新プログラム
932298 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2003 Service Pack 1 C ランタイムの 2007 年夏時間変更の更新プログラム
932392 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2005 C ランタイムの 2007 年夏時間変更の更新プログラム
932391 [FIX] TZ 環境変数の問題に対処する Visual C++ .NET 2005 Service Pack 1 C ランタイムの 2007 年夏時間変更の更新プログラム
932590 [FIX] DST の変更が原因で、TZ 環境変数を使用する Windows ベースのアプリケーションが正常に機能しないことがある

プロパティ

文書番号: 932955 - 最終更新日: 2007年5月25日 - リビジョン: 3.4
この資料は以下の製品について記述したものです。
  • The C Run-Time (CRT)
  • Microsoft Visual Studio 2005 Service Pack 1
  • Microsoft Visual Studio 2005 Team Foundation Server
  • Microsoft Visual Studio 2005 Team System Team Foundation
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Express Edition
  • Microsoft Visual Studio .NET 2003 Service Pack 1
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET (2002), Enterprise Architect Edition SP1
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Academic Edition
キーワード:?
kbinfo kbhowto KB932955
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com