如何處理日期和時間,包括 DST

文章翻譯 文章翻譯
文章編號: 932955 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

簡介

開發人員撰寫處理日期和時間的應用程式可能會使用一或多個執行日期操作和時間操作的技術。 在特別某些基底的作業系統 API、 C 執行階段 (CRT) 和 Microsoft.NET Framework 可能轉換或操作日期和時間。本文將告訴您一些一般參與處理日期和時間的概念。 在另外本篇文章將探討某些產品及技術日光節約時間 (DST) 2007年變更的效果。

其他相關資訊

時間儲存和管理

加上時間戳記是指定日期和時間組合的值。通常必須處理的時間戳記的應用程式會儲存那些時間戳記在國際標準時間 (UTC)。 如果要查看 UTC 的優點是 UTC 是通用。 如果要查看 UTC 是不受限於本地時區,或是 DST。 但是,UTC 是易於使用和相關大部分使用者都不。 雖然 UTC 儲存明顯的選擇不顯示很好的選擇。 因此,大部分的應用程式 UTC 時間前將轉換為本地時間它們顯示給使用者的時間戳記。 比方說 Windows 檔案總管適用的時區和 DST 設定於 UTC 時間戳記之前它顯示 [Windows NT 檔案系統 (NTFS) 目錄中的 [檔案的日期和時間。

從 UTC 時間轉換成當地時間可被視為套用兩個位移。 第一個是時區] 位移,第二個是 DST 位移。 因此,本地時間實際上是 UTC 時間加上帶有的時區位移,加上任何適用的 DST 位移。 時區位移就相當簡單。 電腦已經設定成一個特定的時區,該時區已從 UTC 位移。 若要判斷是否應套用 DST 位移是更為複雜。這項活動依賴許多複雜且動態的規則。

與 DST 2007 最近變更這些複雜的 DST 規則。 2007 從開始美國境內已採用新的開始日期和新的結束日期的 DST。 在另外是很常見的其他國家和政府定期變更開始日期和結束日期的 DST 其控制下的時區中。 下一節將說明開發人員相關產品的 DST 2007 變更的效果。

如需有關 DST 2007 的詳細資訊,請造訪下列 Microsoft 網站 (英文):
http://support.microsoft.com/gp/cp_dst

在開發人員相關技術的 DST 2007 效果

Windows

在 Windows Update 和 Microsoft 更新,有可用的更新,讓 Windows 正確套用 [變更為 DST 2007 和下列年份。 套用這些更新之後 Windows 將正確地計算目前位移從 UTC 時間為本地時間如電腦通過 DST。 位移包括,位移為基底的 API 及網路與時間相關的 API。

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
942763Microsoft Windows 作業系統的 2007 年十二月的累積時區更新

C 執行階段 (CRT)

轉譯的日期及時間轉譯,也會執行 CRT。 因此,CRT 也必須更新以包含新規則的 DST 2007。 CRT 會執行它自己時間,處理的只有當 TZ 環境變數設定或基礎的作業系統 API 時間呼叫失敗時。 有可用 CRTs 所包含的每個版本的 Microsoft Visual Studio,也為 CRTs 隨附於 Windows 的更新。 這些更新可讓 CRT 繼續正確地處理在美國境內時區的 DST 轉換。

.NET Framework

.NET Framework 會依賴基礎作業系統呼叫。 因此,.NET Framework 行為會反映出基礎作業系統的狀態。 需要個別的更新。

Visual Studio.NET 整合開發環境 (IDE)

Visual Studio.NET IDE 包括版本 2002年、 2003 和 Microsoft Visual C++、 Microsoft Visual C#,和 Microsoft Visual Basic 2005。 這些產品會受到影響,因為它們包含 CRT。沒有 IDE 的特定更新是必要的。

Visual Studio 2005 Team Foundation 伺服器

Visual Studio 2005 Team Foundation 伺服器依賴日期和時間轉換為基礎的作業系統。 因此,Visual Studio 2005 Team Foundation 伺服器展示區相同作業系統的行為。 Visual Studio 2005 Team Foundation 伺服器也需仰賴 Microsoft SQL Server、 SQL Server 報表服務和 Windows SharePoint 服務而定。 電腦應該根據相關的更新操作系統、 SQL Server 和 Windows SharePoint 服務進行更新。 應該在所有受影響的電腦上同時套用所有相關的更新。沒有單獨的 Visual Studio 2005 Team Foundation 伺服器更新是必要的。

Visual Studio 2005 Team 系統

透過作業系統透過 Visual Studio 2005 Team Foundation 伺服器,以及透過 CRT,Visual Studio 2005 Team System 會受到影響。 沒有單獨的 Visual Studio 2005 Team System 更新是必要的。

Visual SourceSafe

如需有關 Visual SourceSafe DST 問題 2007年中,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
931804在 2007年中的視覺化 SourceSafe 日光節約時間問題

Visual Basic 6.0 中執行階段

Visual Basic 6.0 中執行階段並不會受到影響。

Visual C++ 6.0

Visual C++ 6.0 中不再受到支援。

如需詳細資訊請造訪下列 Microsoft 網站]:
http://support.microsoft.com/lifecycle/

Windows 軟體開發套件 (SDK) 的 Windows Vista

此 SDK 包含受 DST 2007 變更的 CRT 的版本。此 SDK 安裝的一部分您可以在還沒有 CRT 安裝該版本的電腦上安裝 Visual Studio 2005 CRT。如果已經安裝較新版的 CRT,SDK 安裝並不會覆寫該較新版本。解除安裝 SDK 時, 最新版本的 CRT 就會留在電腦上。之前或之後安裝 SDK,可能是安裝 Visual Studio 2005 CRT 更新。

[Windows SDK 的 Windows Vista 也會針對 Visual Studio 2005 CRT,CRT 轉散發自訂的 C + + 應用程式的一部分的安裝一組的合併模組 (.msm 檔案)。 應用程式,便可轉散發的 CRT 部署至應用程式的安裝資料夾必須部署更新的 CRT 從 Visual Studio 2005 CRT 更新,而非從 [Windows SDK 的 Windows Vista CRT.msm 檔案。 應用程式,便可轉散發的 Visual Studio 2005 CRT 更新部署至 Windows 安裝資料夾必須將 Visual Studio 2005 CRT 可轉散發更新套用到這些電腦。

Microsoft Windows Server 2003 R2 的 SDK 的平台

此 SDK 包含受 DST 2007 變更的 CRT 的版本。 客戶必須遵循此 SDK 版本注意事項,而且如果有必要,請使用 Visual Studio 2005 CRT 更新。

.NET Framework 2.0 SDK

此 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() 函式取得目前的 UTC 時間了 SYSTEMTIME 結構它或 FILETIME 結構中。
  • GetLocalTime() 函式會取得了 SYSTEMTIME 結構它目前的本機時間。
  • GetTimeZoneInformation() 函式會取得 TIME_ZONE_INFORMATION 結構描述目前的時區和電腦的 DST 設定。
  • SystemTimeToFileTime() 函式和 FileTimeToSystemTime() 函式封送處理 SYSTEMTIME 結構和 FILETIME 結構之間。
  • FileTimeToLocalFileTime() 函式和 LocalFileTimeToFileTime() 函式轉換,翻譯 FILETIME 結構,如果要查看 UTC 與當地時間的電腦上使用目前的時區和 DST 設定。
  • SystemTimeToTzSpecificLocalTime() 函式和 TzSpecificTimeToSystemTime() 函式會轉換了 SYSTEMTIME 結構它的 UTC 時間戳記為本機 SYSTEMTIME 結構它。這些函式會使用指定的 DST 的開始日期和結束日期的 TIME_ZONE_INFORMATION 結構。預設情況下,提供沒有這類結構時,會使用目前的 DST 規則。
  • NetRemoteTOD() 函式會透過使用伺服器 ’s 資訊和設定,從遠端伺服器取得時間。
附註FileTimeToLocalFileTime() 函式和 LocalFileTimeToFileTime() 函式使用只有目前的時區資訊和 DST 資訊執行 UTC 時間和本地時間之間轉換。 這種轉換無論要轉換的時間戳記。

如果要查看這個行為,在 [檔案總管] 中的範例,請位於使用 DST 的時區的電腦上依照下列步驟執行。

要注意這些步驟需要您變更系統時鐘。因此,您必須結束之前您遵循這些步驟可能會反應至這些時間變更的行事曆應用程式這類任何應用程式。
  1. 在電腦上的將日期變更為 DST 天。 比方說,將日期設定為 2006 年 7 月 1 發行。
  2. 在同一部電腦上的一個 NTFS] 目錄中建立新的文字檔案,而名為 Test.txt。
  3. 請注意在檔案上時間戳記會顯示,如下所示在 [檔案總管] 中:
    7/1/2006年下午 3: 37
  4. 在電腦上的將日期變更為非 DST 天。 比方說,將日期設定為 2007 年 2 月 1。
  5. 重新整理 [Windows 檔案總管] 視窗。
  6. 請注意在檔案上時間戳記會顯示,如下所示在 [檔案總管] 中:
    7/1/2006年下午 2: 37
在這個前一個範例並不會改變 UTC 時間戳記,在檔案上。但是,用來轉換成當地時間的時間戳記的規則變更取決於電腦上目前的日期。 在步驟 3,因為 7 月 1 日之內 DST 範圍套用 DST 位移。 在第 6 步驟沒有 DST 位移套用,因為 2 月 1 日不會不符合 DST 範圍。 這個問題的發生原因,是使檔案時間戳記可以轉換是本地時間與當地時間。

如需詳細資訊,請參閱這個的部落格]:
http://blogs.msdn.com/oldnewthing/archive/2003/10/24/55413.aspx
SystemTimeToTzSpecificLocalTime() 方法和 TzSpecificTimeToSystemTime() 方法 UTC 時間與本地時間之間轉換藉由使用所提供的 TIME_ZONE_INFORMATION 結構中。 如果提供沒有時區資訊這些函式使用目前的時區規則,而且 DST 規則來決定是否 DST 位移必須套用到時間戳記。這是呼叫 GetTimeZoneInformation() 方法,以取得目前正在效果 TIME_ZONE_INFORMATION 結構功能上相等的。

TIME_ZONE_INFORMATION 結構包括開始日期] 與 [停止日期的 DST)。因此時 TIME_ZONE_INFORMATION 結構會使用目前的時區資訊,, TIME_ZONE_INFORMATION 結構可能會引入歷史 inaccuracy。如果目前的時區資訊以及 DST 資訊不會反映正在轉換時間戳記,可能就會發生這個問題。這種行為會受到 DST 2007,因為控制何時 DST 開始與停止的日期的規則已有所變更。

若要取得從這些函式的歷史上精確轉換,應用程式必須提供歷史上精確的 TIME_ZONE_INFORMATION 結構當應用程式呼叫這些函式。

在 Windows 中的動態時區

Windows Vista 引進了動態 DST 時區。動態 DST 提供對其界限的 DST 變更年份從年時區的支援。這些規則會儲存在登錄中。應用程式可以使用 GetDynamicTimeZoneInformation() 函式來查詢規則。

動態時區啟用更容易更新特別是針對其中每年的 DST 界限事先已知的地區設定的電腦。 如需有關在 Windows SDK 適用於 Vista DYNAMIC_TIME_ZONE_INFORMATION 結構的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
http://msdn2.microsoft.com/en-us/library/ms724253.aspx

C 執行階段 (CRT) 中的本機時間轉換

CRT 基本上有三種模式,它可以在此翻譯時間戳記:
  • 如果未設定 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 也會處理過去和未來的美國日期。 CRT 的更新會列在 「 參考 」 一節。

在.NET Framework 中的本機時間轉換

.NET Framework 包含儲存和轉換的時間戳記的類別。 這些類別包括 日期時間 類別、 時區 類別、 TimeSpan] 類別及 DateTimeKind 類別。 如先前所述這些類別主要是會視基礎平台實作。 這些類別展現相同基礎作業系統 API 的行為。

其中一個有趣的行為固定由.NET Framework 日期類別和次類別與位移時間戳記要求數量的函式。 例如,考慮 AddHours() 函式、 AddMinutes()] 函式和 AddSeconds() 函式,在類別中的 日期時間。 這些函式,與相似命名函式只是以要求的數量,而不管 DST 設定遞增時間戳記。這種行為可能被視為簡單的算術運算基礎的 UTC 時間戳記上。 不過,這種行為可能會導致未預期的結果時加入會造成傳遞或移出 DST 時間戳記。 這種行為,DST 2007 變更與無關。

建議事項

下列建議可以協助開發人員的 DST 2007 影響最小化並改善一般日期及時間處理。
  • 您應該規劃附近原子 DST 2007 更新的安裝。 所有計劃的 DST 2007 更新應該套用為關閉的時間到另一個儘。如果已更新的電腦會嘗試使用與尚未更新的電腦通訊的方法 (如 SQL 查詢或 Web 服務,可能會發生轉譯錯誤。同樣地,如果單一的電腦需要兩個或多個更新,例如 Windows 更新和 CRT] 更新更新應該套用一次。
  • UTC 時間戳記是歷史上精確。 它通常是轉換成情況牽涉到大部分的應用程式的本地時間。 應用程式應該一律儲存 UTC 時間戳記。 轉換為本地時間,用於顯示需要的時區資訊和 DST 資訊。 這項資訊可以來自幾個來源:
    • 應用程式可能會轉換為使用目前的時區和 DST 設定。 如果目前的時區和 DST 設定沒有作用中一次的時間戳記,這可能會引入轉換中的 inaccuracy。
    • 應用程式可能會儲存先前精確的時區資訊和除了 UTC 時間戳記的 DST 資訊。
    • 動態時區可用時,應用程式可能使用動態的時區,若要判斷哪一個時區資訊應該套用至特定的 UTC 時間戳記。 只有動態時區資訊是使用特定的時間戳記,以及特定時區時,此選項才能使用。
    • 應用程式可能會儲存本機時間戳記和 UTC 時間戳記。這個方法會防止未來轉換的需求。
  • 任何時間戳記處理的電腦之間的通訊應該使用 UTC 時間戳記。 隱含如此兩台電腦 UTC 相同的內容資訊。
  • 如果應用程式處理日期,應該要小心與日期在測試處理方式。 沒有時間資訊顯示的日期通常儲存為時間戳記的相關日期 12: 00 AM。 因此,[小時] 部分的時間戳記中的關閉一個錯誤可能會導致關閉一個結果有效的日期中如果時間會移至前一天的下午 11: 00。

?考

如需有關 DST 2007 Microsoft 入口網站的詳細資訊,請造訪下列 Microsoft 網站: http://support.microsoft.com/gp/cp_dst如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件]:
942763Microsoft Windows 作業系統的 2007 年十二月的累積時區更新
931975如何在 2007年準備 SQL Server 2005 和 SQL Server 2000 的日光節約時間變更
931804在 2007年中的視覺化 SourceSafe 日光節約時間問題
如需詳細資訊請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
http://msdn2.microsoft.com/en-us/library/ms724277.aspx

http://msdn2.microsoft.com/en-us/library/ms724490.aspx

http://msdn2.microsoft.com/en-us/library/ms725473.aspx
若要取得 C 執行階段 (CRT) 的 DST 2007 更新,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
932305FIX: Visual C++.NET 2002 C 執行階段日光節約時間 2007年更新 TZ 環境變數問題
932304FIX: Visual C++.NET 2002年服務封包 1 C 執行階段日光節約時間 2007年更新 TZ 環境變數問題
932299FIX: Visual C++.NET 2003 C 執行階段日光節約時間 2007年更新 TZ 環境變數問題
932298FIX: Visual C++.NET 2003年服務封包 1 C 執行階段日光節約時間 2007年更新 TZ 環境變數問題
932392FIX: Visual C++.NET 2005 C 執行階段日光節約時間 2007年更新 TZ 環境變數
932391FIX: Visual C++.NET 2005年服務封包 1 C 執行階段日光節約時間 2007年更新 TZ 環境變數
932590FIX: 使用 TZ 環境變數的 Windows 架構應用程式可能無法如預期般由於的 DST 變更

屬性

文章編號: 932955 - 上次校閱: 2008年1月15日 - 版次: 5.2
這篇文章中的資訊適用於:
  • 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 專業版
  • 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
關鍵字:?
kbmt kbinfo kbhowto KB932955 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:932955
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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