Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

具體細節

運算
設計目標
折衷:穩定性、可預言性和近似值
術語
參考
構建與編譯器信息
測試
變更歷史
鳴謝

運算

時間點 -- 時長 -- 時間間隔(時間段) -- 特殊值的處理

時間點

本節描述一些用於時間點的基本算術規則。通常,時間點支持以下與時長的基本算術操作:

      時間點 + 時長  --> 時間點
時間點 - 時長 --> 時間點
時間點 - 時間點 --> 時長

和普通的算術類型不同,以下操作是未定義的:

      時長 + 時間點  --> 未定義
時長 - 時間點 --> 未定義
時間點 + 時間點 --> 未定義

時長

時長表示一段時間的長度,它的值可正可負。它通常會與另一個時長或者簡單的整數值進行運算。以下描述了這些運算:

      時長 + 時長  --> 時長
時長 - 時長 --> 時長

時長 * 整數 --> 時長
整數 * 時長 --> 時長
時長 / 整數 --> 時長 (整數除法規則)

時間間隔 (時間段)

時間間隔對於簡化日期和時間的很多'運算'是非常有用的。下面描述了基於半開區間的時間段所提供的操作。以下操作基於兩個輸入時間段計算得到新的時間段:

時間段與時間段的交集運算 --> 時間段 
(如果不相交則為空時間段)
時間段與時間段的合併運算 --> 時間段
(如果不相交則為空時間段)
時間段位移一定時長 --> 時間段
(將開始時間點和結束時間點位移一定時長)

另外,時間段支持多種查詢操作,返回布爾類型的結果。第一組操作是與另一個時間段進行運算:

  時間段 == 時間段      --> bool
時間段 < 時間段 --> bool (true 如果 lhs.last <= rhs.begin)
時間段 與 時間段 相交 --> bool
時間段 包含 時間段 --> bool
時間段 與 時間段 相鄰 --> bool

以下是與時間點之間的運算:

  時間段 包含 時間點     --> bool
時間段 早於 時間點 --> bool
時間段 晚於 時間點 --> bool

特殊值的處理

讓時長和時間點類型支持象無效日期時間(NADT)和無限時長這樣的特殊值,對於很多時間運算的問題來說是很有用的。通常,像無效日期時間(NADT)和無限時長這樣的特殊值同樣遵循浮點數的規則。注意,你可以將系統配置為以拋出異常來替代 NADT 的結果。

  時間點(NADT) + 時長 --> 時間點(NADT)
時間點(∞) + 時長 --> 時間點(∞)
時間點 + 時長(∞) --> 時間點(∞)
時間點 - 時長(∞) --> 時間點(-∞)

同時對正無限和負無限進行運算時,本庫將產生以下結果:

  時間點(+∞) + 時長(-∞) --> NADT
時長(+∞) + 時長(-∞) --> NADT
時長(±∞) * 零時長 --> NADT

時長(∞) * 整數(非零) --> 時長(∞)
時長(+∞) * -整數 --> 時長(-∞)
時長(∞) / 整數 --> 時長(∞)

設計目標

分類 說明
功能
接口 提供對日期和時間進行操作的具體類
  • date, time, date_duration, time_duration, date_period, time_period, 等等
  • 支持無限 - 正無限、負無限
  • 時間和日期區間上的迭代器
  • 允許日期和時間的實現盡可能分離
運算 提供高效執行時間運算的基礎
  • 日期之間的天數
  • 時間長度
  • 日期和時間一起的長度
表示的靈活性 提供最大的可重用性和靈活性
  • 基於 traits 的內容表示法定制,用於控制對像大小和精度
  • 可以使用不同的紀元和精度(如:秒或微秒,從2000年開始或從1700年開始)
  • 可選配置唯一的曆法表示法(格里曆或其它)
  • 可使用儒略歷天數,以及它與格里曆/儒略歷日期間的轉換。
  • 可以進行包括閏秒在內的靈活調整
日期運算 提供日期運算的工具
  • 提供複雜事件如假日計算的基礎
  • 曆法到曆法間的轉換
  • 提供了擴展新曆法系統的能力
時間運算 提供對時間進行操作的具體類
  • 提供處理跨時區問題的能力
  • 提供夏令時調整的能力
時鐘接口 提供取出當前時間的類
  • 訪問網絡時間源/高精度時間源
  • 將當前的日期時間設置到各個組裝類中
I/O 接口 提供時間的輸入輸出,包括
  • 多語言支持
  • 提供符合 ISO8601 的時間 facet
  • 對不同的本地行為使用 I/O facets

折衷:穩定性、可預言性和近似值

不可避免的折衷

本庫盡最大努力提供用戶可能想要的所有東西,但是還是存在一些任何時間程序庫都會遇到的固有的限制。尤其是,用戶必須在任何應用都想得到的以下三種能力中選擇兩個:

  • 與 wall-clock 時間的精確吻合
  • 精確的數學,如:時長計算
  • 處理未來時間點的能力

有的程序庫可能暗中許諾提供所有三種能力,但是如果你真的對它們進行測試,就會發現同時只能有兩個為真。這種限制不是任何特定程序庫的設計或實現上的不足;而是由國際標準所定義的不同時間系統所造成的結果。我們來看看以下三種情形:

如果你想精確吻合 wall-clock 時間,你就必須使用 UTC 或本地時間。如果你通過將兩個 UTC 時間相減來計算得到一個時長,並且希望結果精確到秒,那麼這兩個時間必須不能是很遠的未來,因為閏秒會影響結果而只能確定未來大約6個月的時間。對於本地 時間,未來時長的計算應該限制在一個小時內,因為相關機構可以在未來改變 DST 規則。

如果你想處理未來的 wall-clock 時間,你就不能(一般而言)精確計算時長,原因同上。

如果你想精確計算未來時間,你就必須使用 TAI 或其它等價物,但是從 TAI 到 UTC 或本地時間的映射是依賴於閏秒的,所以你無法與 wall-clock 時間精確吻合。

穩定性、可預言性和近似值

以下是一些基本理論,有助於解釋到底發生了什麼事。記住,一個表示時間的類型,就像任何抽像數據類型(ADT)一樣,是一組值加上在這些值上的操作。

穩定性

如果對應於某個給定值的位組合不會隨時間而變化,就說這個類型的表示法是穩定的。一個具有不穩定表示法的類型對於任何人都不會有太大用處,所以我們應該強調,任何時間類的程序庫都應該只使用穩定的表示法。

如果對於特定操作數進行操作所得到的結果不會隨時間而變化,就說這個類型的操作是穩定的,。

可預言性

集合通常被分為兩類:良好定義的和不良定義的。由於類型也是一種集合,所以我們將這些定義擴展用於類型。對於任意類型 T, 必須存在一個謂詞 is_member( x ) 用於判定某個值 x 是否為類型 T 的成員。這個謂詞必須返回 true, false,dont_know.

如果對於所有 x, is_member( x ) 的返回值要麼是 true 要麼是 false, 那麼我們就說集合 T 是良好定義的。

如果對於某個 x, is_member( x ) 返回 dont_know, 則我們說集合 T 是不良定義的。

這些是在數學上常用的規則。但是,由於時間類型的特殊性質,需要改進這一觀點並創建以下第三種類別:

對於時間類型 T, 必須存在一個謂詞 is_member( x, t ) 用於判定某個值 x 是否為 T 的成員。參數 t 表示對該謂詞進行求值時的時間。對於每個 xi, 必然存在一個時間 ti 和一個值 v 滿足:

  • v = true 或 v = false, 且
  • 對於所有 t < ti, is_member( xi, t ) 返回 dont_know, 且
  • 對於所有 t >= ti, is_member( xi, t ) 返回 v.

ti 是我們可以「找出」 xi 是否為 T 的成員的時間。現在我們可以為時間類型定義第三種類別:

如果對於所有 xi, ti = 負無限,則我們說類型 T 是可預言的

如果對於某些 xi, ti = 正無限,則我們說類型 T 是不良形式的

否則,我們說類型 T 是不可預言的(這意味著對於某些 xi, ti 是一個有限值)。

不良形式的集合實際上沒有什麼用,所以我們後面將不再討論它。坦白地說,以上定義表明了,可預言類型的所有值都是提前可知的,而不可預言類型的某些值則在某個特定時間之前是不可知的。

操作的穩定性

可預言類型有幾個重要的特點:

  • 它們的元素與連續整數集合之間存在一種順序不變的映射關係,且
  • 對它們的值所進行的時長操作是穩定的

這些特性的實際效果是,可以用簡單的整數減法來實現時長的運算。可預言類型的例子有:TAI 時間點和格里曆日期。

不可預言類型則剛好具有相反的特點:

  • 它們的元素與連續整數集合之間不存在順序不變的映射關係,且
  • 對它們的值所進行的時長操作是不穩定的

不可預言類型的例子有:UTC 時間點和本地時間時間點。

我們可以進一步說,由不可預言類型組成的區間可以是可預言的,而對於在此區間內的值進行操作也將是穩定的。例如,從1970-01-01到現在的 UTC 時間點所組成的區間就是可預言的,所以在此區間內的時長運算也是穩定的。

近似值

以上限制是一個要解決的問題,因為象 UTC 和本地時間這些時間類型實際上是不可預言的,因而對它們的操作有時候是不穩定的。而實際上我們經常需要執行這類操作,如計算用本地時間表示的未來兩個時間點之間的長度。

本庫可以做到的最好情況是提供一個近似值,這一點通常都是可能的,而且對於大多數用途而言也已足夠。當然文檔中必須要指明什麼時候得到的結果是一個 近似值(因而是不穩定的),並說明可能的誤差有多大。不可預言類型集合上的運算,在很多方面上類似於浮點數的運算,得到的結果只是精確值的一個近似。而可 預言類型集合上的運算則類似於整數運算,其結果總是精確的。

在需要精確結果或不能容忍不穩定性的情形下,用戶必須能夠指明這一點,然後程序庫會在用戶請求一個運算而無法得到精確、穩定的結果時拋出異常。

術語

以下是一些與日期時間領域相關的術語。

時間類型的分類:

  • 時間點Timepoint -- 指定在時間連續統中的某個位置。類似於尺子上的一個數字。
  • 時長Timelength -- 一段時間的跨度,不與時間連續統上某個點相關聯。
  • 時間間隔Timeinterval -- 一段時間的跨度,與時間連續統中某個特定點相關聯。

其它術語:

  • 準確度Accuracy -- 對誤差的一種量度,時鐘讀數與真實時間間的差距。
  • 曆法系統Calendar System -- 一種採用天級解析度來標記時間點的系統。
  • 時鐘設備Clock Device -- 一個軟件組件(與某個硬件綁定),根據某個曆法系統或時鐘系統提供當時的日期或時間。
  • 精確度Precision -- 對時鐘的可重複性的量度。
  • 解析度Resolution -- 時鐘/曆法系統或時間類型中可表示的最小時長(如:1秒,1個世紀)的規格說明。
  • 穩定性Stability -- 類的特性,說明底層的表示(或實現)被關聯到一個不會改變的特定(抽像)值。
  • 時間系統Time System -- 一種採用比天級解析度更高的解析度來標記時間點的系統。

一些標準的日期-時間術語:

  • 紀元Epoch -- 某個曆法系統或時鐘系統的開始時間點。
  • DST -- 夏時制Daylight savings time - 某些地區採用的一種本地時間,在夏天的時候對時鐘時間進行偏移。
  • 時區Time zone -- 地球上的某個區域,提供由 DST 規則和 UT 位移共同定義的『本地時間』。
  • UTC 時間 -- 坐標世界時間Coordinated Universal Time - 在零經度位置進行測量的民用時間系統。通過閏秒的調整來適應地球的自轉。也被稱為 Zulu 時間。類似的系統有格林威治標準時間。更多詳情請見 http://aa.usno.navy.mil/faq/docs/UT.html
  • TAI 時間 -- 一種高精度的恆定時間系統,通過世界各地的原子鐘來測量 .1 微秒的解析度。不與地球的自轉相適應。更多詳情請見 http://www.bipm.fr/enus/5_Scientific/c_time/time_server.html

一些更實驗性的術語:

  • 本地時間Local Time -- 在世界某地測量得到的時間。
  • 時間標識Time Label -- 一個元組,完整或部分給出與一個曆法系統或時鐘系統相關的特定日期-時間。以年-月-日的方式表示。
  • 調整的時間長度Adjusting Time Length -- 一段時間長度,依據不同時期表示不同的實際時長。例如,1個月的時長不能代表固定的天數,它根據量度時的日期來確定實際的長度。

以下是設計類的術語:

  • 生成函數Generation function -- 根據一個或多個參數,生成特定的時間點、時間長度或時間間隔集合的函數。

參考

本庫的設計當前正在通過 Wiki 和郵件討論不斷改進。你可以在 Boost Wiki GDTL Start Page 上找到更多的信息。

日期和曆法參考

時間

其它 C/C++ 程序庫

JAVA 日期時間庫速查

腳本語言的程序庫

相關的商業和奇特的網頁

解析度,精度和準確度

構建和編譯器信息

簡介 -- 編譯選項 -- 編譯器/可移植性說明 -- 目錄結構 -- 所需的 Boost 庫

簡介

本庫中有少量函數需要創建庫文件(主要是 to_string, from_string 函數)。大多數庫用戶無需構建庫文件就可以正確地使用本庫,只需要包含所需的頭文件即可。如果需要庫文件,位於 build 目錄下的 Jamfile 將生成一個"靜態"庫(libboost_date_time)以及一個"動態/共享"庫(boost_date_time),其中包含了這些函數。

編譯選項

缺省情況下,posix_time 系統內部使用一個64位整數來提供微秒級的解析度。作為另一個選擇,使用一個64位整數加一個32位整數(共96位精度),可以提供納秒級的解析度。缺省實現可以提供更好的性能和最小的內存佔用,多數應用程序並不需要納秒級的解析度。

要使用更高的解析度(96位納秒級別),必須在庫用戶的工程文件(如 Makefile, Jamfile, 等等)中定義變量 BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG. 該宏並不被格里曆系統使用,因此在構建本庫時沒有作用。

和版本1.33一樣,date_time 庫引入了一個新的IO流系統。有些編譯器不能使用這個新系統。對於這些編譯器,早期的("遺留")IO系統仍然可用。不被支持的編譯器將自動選擇遺留系統,但用戶也可以通過定義 USE_DATE_TIME_PRE_1_33_FACET_IO 來強制使用遺留系統。

為方便使用,date_time 提供了一些 額外的時間長度類型。使用這些類型可能會由於「保持為月末」的行為而導致意外結果(完整細節和例子請見 操作可逆性的缺陷)。缺省情況下,這些類型都是可用的。要禁止這些類型,只需在你的工程文件中去定義 BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES 即可。

另一個方便的用法是 dateptime 的缺省構造函數。缺省情況下這些構造函數是可用的。要禁止它們,只需在你的工程文件中定義 DATE_TIME_NO_DEFAULT_CONSTRUCTOR 即可。

編譯器/可移植性說明

Boost Date-Time 庫已經在多個編譯器和平台上進行了構建和測試。但是,有些編譯器和標準庫存在問題。而這些問題中有些可以繞過,其它一些則很難繞過。以下編譯器已知完全支持本庫:

  • Codewarrior 9.4 Windows
  • GCC 3.2 - 3.4, 4.x on Linux
  • GCC 3.3, 4.x on Darwin
  • GCC 3.3 - 3.4, 4.x on Solaris
  • GCC 3.3, 4.x on HP-UX
  • QCC 3.3.5 on QNX
  • MSVC 7.1 Windows
  • Intel 8.1-9.x Linux and Windows

不幸的是,VC8 編譯器對於 date-time 代碼有些問題。其中最嚴重的問題是,在引入VC8標準庫的 basic_stream 代碼時存在內存洩漏。Date-time 的代碼已經盡可能作出修改以避免這一問題,但如果你使用遺留IO選項(這不是VC8的缺省選項),那麼問題仍會出現。更多細節請見 郵件列表存檔

除了以上問題,有些版本的VC8庫限制了 std::tm 結構中的值為正值。這是VC8中新增的限制。產生的影響是,1900年以前的日期將引發異常。不幸的是,這一問題沒有替代方案。注意,新的64位版本VC8編譯器不再存在這一限制。

以下編譯器支持本庫除 wstring/wstream 輸出以外的所有功能。

  • MinGW 3.2, 3.4, 3.5 *
  • GCC 3.2 (cygwin) *

特別地,缺乏標準 locales 支持將會限制本庫的能力,無法支持基於 iostream 的輸入輸出。對於這些編譯器,我們提供一組更為有限的基於字符串的輸入輸出。具有這種限制的編譯器/標準庫包括:

  • Borland 5.6

對一些較老的編譯器的官方支持現在已被停止。它們包括:

  • GCC 2.9x
  • Borland 5.1.1
  • MSVC 7.0 and 6 SP5

Visual Studio & STLPort

對於 Visual Studio (7.0 & 7.1) 和 STLPort,有一個著名的問題。構建錯誤通常會指向一個類型問題或 'no acceptable conversion' 以及試圖以 wchar_t 實例化一個模板。STLPort 的缺省構建並不支持 wchar_t. 這個問題有兩個解決方法。最簡單的方法是,用法可以構建不帶寬字符流/寬字符串的 date_time. 另一個方法是,重建 STLPort 以支持 wchar_t.

要構建不帶寬字符流/寬字符串的 date_time, 在 $BOOST_ROOT 下執行以下命令:

bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
"-sBUILD=<define>BOOST_NO_STD_WSTRING" \
--stagedir=... --with-date_time stage

(將省略號換為構建系統的正確路徑,有需要時將 TOOLS 調整為正確的工具集)

要重建 STLPort 以支持 wchar_t,只需在 STLPort 的 makefile中指定 /Zc:wchar_t. 然後從 $BOOST_ROOT 執行以下命令以構建 Date_time:

bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
"-sBUILD=&native-wchar_t>on" \
--stagedir=... --with-date_time stage

(將省略號換為構建系統的正確路徑,有需要時將 TOOLS 調整為正確的工具集)

目錄結構

目錄樹結構如下:

/boost/date_time                    -- 公用頭文件和模板代碼
/boost/date_time/gregorian -- 格里曆系統頭文件
/boost/date_time/posix_time -- Posix 時間系統頭文件
/boost/date_time/local_time -- 本地時間系統頭文件
/libs/date_time/build -- 構建文件和輸入目錄
/libs/date_time/test -- 泛型代碼的測試程序
/libs/date_time/test/gregorian -- 格里曆系統的測試程序
/libs/date_time/test/posix_time -- posix_time 系統的測試程序
/libs/date_time/test/local_time -- local_time 系統的測試程序
/libs/date_time/examples/gregorian -- dates 的例子程序
/libs/date_time/examples/posix_time -- time 的例子程序
/libs/date_time/examples/local_time -- nifty 的例子程序
/libs/date_time/src/gregorian -- libboost_date_time 的 cpp 文件
/libs/date_time/src/posix_time -- 空 (有一個文件,但無源代碼...)

所需的 Boost 庫

date-time 的各個部分依賴於某些 boost 庫。它們包括:

所以這些庫必須被安裝。

測試

本庫提供了大量測試程序,它們位於:

      libs/date_time/test
libs/date_time/test/gregorian
libs/date_time/test/posix_time
libs/date_time/test/local_time

目錄中。構建並執行這些測試,以確認庫的安裝是正確的且功能正常。此外,這些測試有利於將庫移植到新的編譯器。最後,這些測試提供了很多在用法舉例一節中沒有明確描述的函數的例子。

變更歷史

從 Boost 1.33 到 1.34 (date_time 1.04 到 1.05)的變更

類型 說明
特性 更新了 date_time_zonespec.csv 文件中的數據,以反映美國/加拿大2007年新的夏時制規則。如果你升級到了新的文件,那麼要清楚本庫只有對於當前或以後的日期轉換才能得到正確的答案。 所以,如果你要對以前的年份進行日期轉換,那麼得到的答案將反映當前的時區規則而不是舊的規則。當前本庫不能支持歷史時區。
特性 還更新了另外兩個 dst 計算特性,以反映新的美國/加拿大時區規則。它們是 boost::date_time::us_dst_rules 和 dst_calc_engine. us_dst_rules 已經被官方反對使用,Graham Bennett 提供的一個補丁可以讓這個類正確用於歷史和未來的日期。而 dst_calc_engine 也被更新,可以正確用於歷史和未來的時間。這樣,各個 local_adjustor 類均可以正確工作。對於使用 dst_calc_engine 的類,其接口有些變化,變化是關於定制的 dst traits 類的。該 traits 類的簽名變為接受一個象 end_month 那樣的 'year' 參數。此外,該 traits 類需要2個新的函數:static date_type local_dst_start_day(year_type year)static date_type local_dst_end_day(year_type year). 實現請見 date_time/local_timezone_defs.hpp 中的例子。
缺陷修復 修復澳大利亞的 DST traits (sf# 1672139),將DST的結束時間設為 3:00 am,替代原來的 2:00 am.
缺陷修復 修復因I/O代碼所引起的多重定義鏈接錯誤。
缺陷修復 修改 greg_serialize.hpp 和 time_serialize.hpp 中的序列化代碼,消除因未使用變量 version 和 file_version 引起的告警。感謝 Caleb Epstein 的建議。
缺陷修復 修復在 FreeBSD 的 GCC 下將 LANG 環境變量設為 russian 時出現的退化錯誤  -- 將分析器改為使用 classic locale 而不是 blank locale.
缺陷修復 修改 tracker 問題 1178092 -- 修改 convert_to_lower,將 local 改為 const static 以加快分析的速度。
缺陷修復 來自 Ulrich Eckhardt 的補丁,修復對 EVC++ 4 的支持。
特性 盡量減少對 basic_stringstream 的使用,以避開 VC8 標準庫中的缺陷。更多信息請見 郵件列表存檔。 

從 Boost 1.32 到 1.33 的變更(date_time 1.03 到 1.04)

類型 說明
缺陷修復 如果時間段的開始點和結束點相同或相連,則時間段長度的計算會有錯。在修正後,當開始點和結束點相同時,或者時間段以零時長創建時,現在將返回長度0。對於開始點和結束點相連的時間段,則返回長度1。
缺陷修復 Time_input_facet 缺少設為ISO格式的函數。而且在不使用分隔符時(%H%M%S),將不能進行分析。這兩個缺陷均已修正。
特性 將 ptime_facet 和 ptime_input_facet 的名字改為 time_facet 和 time_input_facet. 同時刪除所有 ptime_* 版本。
特性 函數 from_iso_string function 不能分析小數。我們增加了代碼以正確地按已編譯庫的精度進行過多或過少數位的分析。帶小數的 Ptimes 也可以正確分析。
缺陷修復 新IO中的分析機制在進一次匹配後會吃掉下一個字符。在試圖分析以特殊值作為開始點的時間段時就會出現這個缺陷。
缺陷修復 新的IO系統無法為用戶提供「打開」流操作的異常機制的功能。即使分析失敗,failbit 位也不會置位。現在這些問題都已得到修正。
缺陷修復 以 from_*_string 函數分析特殊值的問題已修正。這使得本庫可以對特殊值進行序列化。Time_duration 現在可以序列化為字符串或單獨的字段(取決於 is_special())。
缺陷修復 以前,partial_date 的流輸出會以一位或兩位數字的方式來顯示天數(即 '1', 或 '12')。現在已更正為只使用兩位數字(即 '01')。
特性 主要的新特性都與本地時間的管理有關。包括引入了一系列新類,用於表示時區和本地時間(完整的細節請見 日期與時間的本地時間)。
特性 輸入和輸出 facets 已被重寫以支持基於格式的格式重定義(完整的細節請見 日期和時間的IO)。
特性 增加一些函數,以方便在 tm 結構與 date, ptime, time_duration, 和 local_date_time 之間的轉換。還提供了將 FILETIMEtime_t 轉換為 ptime 的函數。詳情請見單獨的章節。
特性 microsec_time_clock 中增加了一個 universal_time 函數(有關該函數的完整細節請見 這裡)。
特性 Date-time 現在在可支持的平台上將使用重入的 POSIX 函數,如果定義了 BOOST_HAS_THREADS。
缺陷修復 修正了在序列化代碼中不能從存檔中正確讀回 ptime, time_duration 的特殊值(not-a-date-time, infinities, 等等)的缺陷。輸出用的序列化代碼為特殊值和未定義值的無效 time_duration.seconds() 寫出子字段。這樣當讀回這些值時,可以引發奇特的行為,包括在構造時拋出異常。
缺陷修復 修正了由不同平台/編譯器產生的多個告警。
缺陷修復 以一個超過從 00:00 到 23:59:59.9... 範圍的 time_duration 來構造 ptime,現在會對日期和時間進行調整,以使得 time_duration 落在這一範圍內(即 ptime(date(2005,2,1), hours(-5)) -> "2005-Jan-31 19:00:00",而 ptime(date(2005,2,1), hours(35)) -> "2005-Feb-02 11:00:00")。
缺陷修復 時間分析現在可以正確處理過多位的小數秒。前導的0將被扔掉("000100" -> 100 frac_sec),而過多的數位將在正確的位置被截斷("123456789876" -> 123456 或 123456789,取決於編譯本庫時的精度)。
缺陷修復 改為 boost::serialization 的接口破壞了 date_time 的序列化兼容懷。用戶必須提供函數來在序列化之前確保 date_time 對象是 const 的。該函數類似於:
template<class archive_type, class temporal_type>
void save_to(archive_type& ar,
const temporal_type& tt)
{
ar << tt;
}
缺陷修復 對於已不使用的 boost::tokenizer 接口,已升級為當前的接口。修正了在某些舊編譯器上的編譯錯誤。
缺陷修復 在遺留IO系統中的模板化格式化器接受 char 類型。同時刪掉了對 boost::lexical_cast 的調用。

從 Boost 1.31 到 1.32 的變更(date_time 1.02 到 1.03)

類型 說明
缺陷修復 修正了 year_functor 的「保持為月末」的行為。以前,從 2000-Feb-28 (閏年的非月末日期)開始迭代到下一個閏年,會得到 2004-Feb-29 而不是 2004-Feb-28. 這一行為已得到改正,以生成正確結果 2004-Feb-28. 感謝 Bart Garst 所做的修正。
特性 從 FILETIME 結構創建 ptime 對象的自由函數。該函數只在定義了 BOOST_HAS_FTIME 的平台上可用。
特性 微秒時鐘現在在多數 windows 和 Unix 編譯器上都可以用了。
特性 現在 boost::serialization 庫可以和多數 date_time 類一起使用。具有序列化能力的類有:date_generator 類, date, days, date_period, greg_month, greg_weekday, greg_day, ptime, time_duration, 和 time_period. 感謝 Bart Garst 所做的修正。
特性 新增了將 date 和 time 類轉換為 wstring 的函數。本庫現在提供 to_*_wstring,和 to_*_string 函數一樣,simple, iso, iso_extended, 和 sql for dates 以及編譯器均支持 wstrings. 感謝 Bart Garst 所做的修正。
特性 時間段類現在可以正確處理零時長和 NULL 時間段。NULL 時間段是具有負長度的時間段。感謝 Frank Wolf 和 Bart Garst 所做的修改。
特性 在 gregorian::date 中增加了 end_of_month 函數,以日期表示法返回當前月的最後一天。對於 not_a_date_time 或無限日期,結果未定義。
缺陷修復 刪掉整個庫中對 BOOST_NO_CWCHAR 宏的不正確使用。
特性 為一些日期類增加了新的名字。原來的名字仍然可用,但以後可能會不再使用。改變如下:
date_duration 現在是 days
nth_kday_of_month 現在是 nth_day_of_the_week_in_month
first_kday_of_month 現在是 first_day_of_the_week_in_month
last_kday_of_month 現在是 last_day_of_the_week_in_month
first_kday_after 現在是 first_day_of_the_week_after
first_kday_before 現在是 first_day_of_the_week_before
特性 增加了日期生成器的自由函數。新增的函數是:days_until_weekday, days_before_weekday, next_weekday, 和 previous_weekday.
days days_until_weekday(date, greg_weekday);
days days_before_weekday(date, greg_weekday);
date next_weekday(date, greg_weekday);
date previous_weekday(date, greg_weekday);
感謝 Bart Garst 所做的修改。
特性 為月數、年數和周數增加新的試驗用時長類型。這些類還提供了與日期和時間類的數學操作符。一個28日之後的時間或日期加上一定的月數或年數,可能會出現不正常的數學特性。這是由於這一運算採用了'月末'保持。以下例子示範了這一問題。
months m(12);
years y(1);
m == y; // true
days d(7);
weeks w(1);
d == w; // true
ptime t(...);
t += months(3);
date d(2004,Jan,30);
d += months(1); //2004-Feb-29
d -= months(1); //2004-Jan-29
這些類型的流輸入尚未實現。感謝 Bart Garst 所做的修改。
特性 統一 date_generators 的基類並帶入到 gregorian 名字空間中。請見 打印假日的例子
特性 增加了 date 和 ptime 的缺省構造函數(兩者都有)以及特殊值的構造函數(ptime, 現在兩者均支持)。缺省構造函數將對像初始化為 not_a_date_time (NADT).
ptime p_nadt(not_a_date_time);
ptime p_posinf(pos_infin);
ptime p; // p == NADT
date d; // d == NADT
感謝 Bart Garst 所做的修改。
特性 流輸出現在已可以在支持寬字符流的編譯器/標準庫組合上支持寬字符流。如以下代碼:
std::wstringstream wss;
date d(2003,Aug,21);
wss << d;
感謝 Bart Garst 所做的修改。
特性 date 和 time 類型的流輸入現在已可以支持寬字符和窄字符流:
date d(not_a_date_time);
std::stringstream ss("2000-FEB-29");
ss >> d; //Feb 29th, 2000
std::wstringstream ws("2000-FEB-29");
ws >> d; //Feb 29th, 2000
感謝 Bart Garst 所做的修改。
缺陷修復 修正了以下缺陷:duration_from_string() 當字符串的格式中的小數位不足時會創建一個不正確的 time_duration. 在微秒解析度下,字符串 "1:01:01.010" 會創建時長 01:01:01.000010 而不是 01:01:01.010000
缺陷修復 修正了 gregorian::date 和 posix_time::ptime 的特殊值構造函數以 min_date_time 或 max_date_time 進行構造的問題。這些情形下會構造出錯誤的值。

從 Boost 1.30 到 1.31 的變更(date_time 1.01 到 1.02)

類型 說明
缺陷修復 更新了構建配置文件,現在可以用MSVC編譯器生成 dll, 靜態和動態鏈接的庫文件。更多細節請見 構建/編譯器信息
缺陷修復 Time_duration from_string 現在可以正確地從負值進行構造(如 "-0:39:00.000")。代碼由 Bart Garst 提供。
缺陷修復 修正了在MSVC編譯器下以4級告警級別編譯時的多個告警。
特性 為 date 和 time 迭代器增加了前綴遞減操作符。更多細節請見 Time 迭代器Date 迭代器。代碼由 Bart Garst 提供。
特性 Special_values 功能被增加到 date_duration, time_duration 和 time 類。代碼由 Bart Garst 提供。
缺陷修復 修正了 time_duration_traits 運算中的以下缺陷:儘管有64位環境可用,時長還是被限制在32位的範圍內。感謝 Joe de Guzman 對此缺陷的跟蹤。
缺陷修復 為時間長度類型(如:date_duration, time_duration)提供了其它操作符。這些操作包括:與整數相除以及 +=, -= 操作符。感謝 Bart Garst 編寫了這些代碼。另外,相關的 運算 文檔也有了改進。
缺陷修復 為 boost::gregorian gregorian_types.hpp 中多個 date_generator 函數類增加了 typedef.
特性 增加了 from_time_t function 將 time_t 轉換為 ptime.
特性 增加了對時間段進行合併的 span 函數。請見 日期段時間段 的文檔。
特性 為 time_duration 增加了一個函數,以取出在時長內的總秒數,截斷小數部分。另外,還增加了其它解析度以方便轉換。例如:
seconds(1).total_milliseconds() == 1000
seconds(1).total_microseconds() == 1000000
hours(1).total_milliseconds() == 3600*1000 //3600 秒/小時
seconds(1).total_nanoseconds() == 1000000000
特性 日期生成器 類 - partial_date, first_kday_after, first_kday_before, 等等 - 增加了流輸出操作符。感謝 Bart Garst 的工作。
特性 為時長類型增加了單參數的 - 操作符,將時長的符號反轉。例如:
time_duration td(5,0,0); //5 小時
td = -td; //-5 小時
感謝 Bart Garst 的工作。
特性 增加了對『月份名』字符串的分析支持。現在可以從字符串創建 date 對象,可以接受多種格式 ("2003-10-31","2003-Oct-31", 和 "2003-October-31")。因此,現在可以寫 date d = from_simple_string("2003-Feb-27"). 錯誤的月份名字符串 ( from_simple_string("2003-SomeBogusMonthName-27")) 將引發一個 bad_month 異常。在多數編譯器上,字符串的比較是大小寫敏感的。感謝 Bart Garst 的工作。
特性 增加了對月份名或月份數的支持,加入了從多順序日期字符串創建 date 對象的函數。如: "January-21-2002", "2002-Jan-21", 和 "21-Jan-2003". 更多詳情請見 Date 類
缺陷修復 多個文檔上的修正。感謝 Bart Garst 所做的更新。

從 Boost 1.29 到 1.30 的變更(date_time 1.00 到 1.01)

說明:partial_date 類的接口(見 日期算法) 有所改變。 構造函數的參數順序有所變化,這會導致某些代碼執行失敗。這個改變是為了便於提供更多的本地時間調整泛型代碼。因此,要將使用 partial_date pd(Dec,25) 的代碼改為 partial_date pd(25, Dec);

類型 說明
缺陷修復 增加了新的試驗特性:夏時制計算。基於 traits 來指定 dst 規則。
特性 增加了新的接口,以計算儒略日以及將儒略日修改為 gregorian date 類。請見 boost::gregorian::date.
特性 增加了新的接口,計算某個日期的 iso 8601 周數。請見 boost::gregorian::date.
特性 增加了一個 iso 8601 時間的 date-time 格式 (如:YYYYMMDDTHHHMMSS) 分析函數。更多信息請見 類 ptime
特性 為 period 模板增加一個 length 函數,date_periods 和 time_periods 現在都將支持這個函數。
缺陷修復 對 Jamfiles 進行分離,libs/date_time/build/Jamfile 僅構建庫文件,而 /libs/date_time/libs/test/Jamfile 則運行測試。
缺陷修復 修正多個不重要的文檔問題。
缺陷修復 去掉了引起鏈接錯誤的 DATE_TIME_INLINE 宏。該宏在使用本庫的工程中不再需要。
缺陷修復 為 gregorian_types.hpp 中的 year_iterator 增加了缺少的 typedef.
缺陷修復 修正了格里曆 ostream 操作符,以避免使用寬字符流。
缺陷修復 對日期的錯誤處理更為嚴格,如 date(2002, 2, 29) 將拋出 bad_day_of_month 異常。以前這樣的日期會錯誤構造。由 sourceforge bug 報告: 628054 及其它。

鳴謝

Many people have contributed to the development of this library. In particular Hugo Duncan and Joel de Guzman for help with porting to various compilers. For initial development of concepts and design Corwin Joy and Michael Kenniston deserve special thanks. Also extra thanks to Michael for writing up the theory and tradeoffs part of the documentation. Dave Zumbro for initial inspiration and sage thoughts. Many thanks to boost reviewers and users including: William Seymour, Kjell Elster, Beman Dawes, Gary Powell, Andrew Maclean, William Kempf, Peter Dimov, Chris Little, David Moore, Darin Adler, Gennadiy Rozental, Joachim Achtzehnter, Paul Bristow, Jan Langer, Mark Rodgers, Glen Knowles, Matthew Denman, and George Heintzelman.

Copyright c 2001-2005 CrystalClear Software, Inc

PrevUpHomeNext