![]() |
Home | Libraries | People | FAQ | More |
時間點 -- 時長 -- 時間間隔(時間段) -- 特殊值的處理
本節描述一些用於時間點的基本算術規則。通常,時間點支持以下與時長的基本算術操作:
時間點 + 時長 --> 時間點
時間點 - 時長 --> 時間點
時間點 - 時間點 --> 時長
和普通的算術類型不同,以下操作是未定義的:
時長 + 時間點 --> 未定義
時長 - 時間點 --> 未定義
時間點 + 時間點 --> 未定義
時長表示一段時間的長度,它的值可正可負。它通常會與另一個時長或者簡單的整數值進行運算。以下描述了這些運算:
時長 + 時長 --> 時長
時長 - 時長 --> 時長
時長 * 整數 --> 時長
整數 * 時長 --> 時長
時長 / 整數 --> 時長 (整數除法規則)
時間間隔對於簡化日期和時間的很多'運算'是非常有用的。下面描述了基於半開區間的時間段所提供的操作。以下操作基於兩個輸入時間段計算得到新的時間段:
時間段與時間段的交集運算 --> 時間段
(如果不相交則為空時間段)
時間段與時間段的合併運算 --> 時間段
(如果不相交則為空時間段)
時間段位移一定時長 --> 時間段
(將開始時間點和結束時間點位移一定時長)
另外,時間段支持多種查詢操作,返回布爾類型的結果。第一組操作是與另一個時間段進行運算:
時間段 == 時間段 --> bool
時間段 < 時間段 --> bool (true 如果 lhs.last <= rhs.begin)
時間段 與 時間段 相交 --> bool
時間段 包含 時間段 --> bool
時間段 與 時間段 相鄰 --> bool
以下是與時間點之間的運算:
時間段 包含 時間點 --> bool
時間段 早於 時間點 --> bool
時間段 晚於 時間點 --> bool
讓時長和時間點類型支持象無效日期時間(NADT)和無限時長這樣的特殊值,對於很多時間運算的問題來說是很有用的。通常,像無效日期時間(NADT)和無限時長這樣的特殊值同樣遵循浮點數的規則。注意,你可以將系統配置為以拋出異常來替代 NADT 的結果。
時間點(NADT) + 時長 --> 時間點(NADT)
時間點(∞) + 時長 --> 時間點(∞)
時間點 + 時長(∞) --> 時間點(∞)
時間點 - 時長(∞) --> 時間點(-∞)
同時對正無限和負無限進行運算時,本庫將產生以下結果:
時間點(+∞) + 時長(-∞) --> NADT
時長(+∞) + 時長(-∞) --> NADT
時長(±∞) * 零時長 --> NADT
時長(∞) * 整數(非零) --> 時長(∞)
時長(+∞) * -整數 --> 時長(-∞)
時長(∞) / 整數 --> 時長(∞)
| 分類 | 說明 |
|---|---|
| 功能 | |
| 接口 | 提供對日期和時間進行操作的具體類 |
|
|
| 運算 | 提供高效執行時間運算的基礎 |
|
|
| 表示的靈活性 | 提供最大的可重用性和靈活性 |
|
|
| 日期運算 | 提供日期運算的工具 |
|
|
| 時間運算 | 提供對時間進行操作的具體類 |
|
|
| 時鐘接口 | 提供取出當前時間的類 |
|
|
| I/O 接口 | 提供時間的輸入輸出,包括 |
|
本庫盡最大努力提供用戶可能想要的所有東西,但是還是存在一些任何時間程序庫都會遇到的固有的限制。尤其是,用戶必須在任何應用都想得到的以下三種能力中選擇兩個:
有的程序庫可能暗中許諾提供所有三種能力,但是如果你真的對它們進行測試,就會發現同時只能有兩個為真。這種限制不是任何特定程序庫的設計或實現上的不足;而是由國際標準所定義的不同時間系統所造成的結果。我們來看看以下三種情形:
如果你想精確吻合 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 滿足:
ti 是我們可以「找出」 xi 是否為 T 的成員的時間。現在我們可以為時間類型定義第三種類別:
如果對於所有 xi, ti = 負無限,則我們說類型 T 是可預言的。
如果對於某些 xi, ti = 正無限,則我們說類型 T 是不良形式的。
否則,我們說類型 T 是不可預言的(這意味著對於某些 xi, ti 是一個有限值)。
不良形式的集合實際上沒有什麼用,所以我們後面將不再討論它。坦白地說,以上定義表明了,可預言類型的所有值都是提前可知的,而不可預言類型的某些值則在某個特定時間之前是不可知的。
可預言類型有幾個重要的特點:
這些特性的實際效果是,可以用簡單的整數減法來實現時長的運算。可預言類型的例子有:TAI 時間點和格里曆日期。
不可預言類型則剛好具有相反的特點:
不可預言類型的例子有:UTC 時間點和本地時間時間點。
我們可以進一步說,由不可預言類型組成的區間可以是可預言的,而對於在此區間內的值進行操作也將是穩定的。例如,從1970-01-01到現在的 UTC 時間點所組成的區間就是可預言的,所以在此區間內的時長運算也是穩定的。
以上限制是一個要解決的問題,因為象 UTC 和本地時間這些時間類型實際上是不可預言的,因而對它們的操作有時候是不穩定的。而實際上我們經常需要執行這類操作,如計算用本地時間表示的未來兩個時間點之間的長度。
本庫可以做到的最好情況是提供一個近似值,這一點通常都是可能的,而且對於大多數用途而言也已足夠。當然文檔中必須要指明什麼時候得到的結果是一個 近似值(因而是不穩定的),並說明可能的誤差有多大。不可預言類型集合上的運算,在很多方面上類似於浮點數的運算,得到的結果只是精確值的一個近似。而可 預言類型集合上的運算則類似於整數運算,其結果總是精確的。
在需要精確結果或不能容忍不穩定性的情形下,用戶必須能夠指明這一點,然後程序庫會在用戶請求一個運算而無法得到精確、穩定的結果時拋出異常。
以下是一些與日期時間領域相關的術語。
時間類型的分類:
其它術語:
一些標準的日期-時間術語:
一些更實驗性的術語:
以下是設計類的術語:
本庫的設計當前正在通過 Wiki 和郵件討論不斷改進。你可以在 Boost Wiki GDTL Start Page 上找到更多的信息。
簡介 -- 編譯選項 -- 編譯器/可移植性說明 -- 目錄結構 -- 所需的 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 即可。
另一個方便的用法是 date 和 ptime 的缺省構造函數。缺省情況下這些構造函數是可用的。要禁止它們,只需在你的工程文件中定義 DATE_TIME_NO_DEFAULT_CONSTRUCTOR 即可。
Boost Date-Time 庫已經在多個編譯器和平台上進行了構建和測試。但是,有些編譯器和標準庫存在問題。而這些問題中有些可以繞過,其它一些則很難繞過。以下編譯器已知完全支持本庫:
不幸的是,VC8 編譯器對於 date-time 代碼有些問題。其中最嚴重的問題是,在引入VC8標準庫的 basic_stream 代碼時存在內存洩漏。Date-time 的代碼已經盡可能作出修改以避免這一問題,但如果你使用遺留IO選項(這不是VC8的缺省選項),那麼問題仍會出現。更多細節請見 郵件列表存檔。
除了以上問題,有些版本的VC8庫限制了 std::tm 結構中的值為正值。這是VC8中新增的限制。產生的影響是,1900年以前的日期將引發異常。不幸的是,這一問題沒有替代方案。注意,新的64位版本VC8編譯器不再存在這一限制。
以下編譯器支持本庫除 wstring/wstream
輸出以外的所有功能。
特別地,缺乏標準 locales 支持將會限制本庫的能力,無法支持基於 iostream 的輸入輸出。對於這些編譯器,我們提供一組更為有限的基於字符串的輸入輸出。具有這種限制的編譯器/標準庫包括:
對一些較老的編譯器的官方支持現在已被停止。它們包括:
對於 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 -- 空 (有一個文件,但無源代碼...)
date-time 的各個部分依賴於某些 boost 庫。它們包括:
所以這些庫必須被安裝。
本庫提供了大量測試程序,它們位於:
libs/date_time/test
libs/date_time/test/gregorian
libs/date_time/test/posix_time
libs/date_time/test/local_time
目錄中。構建並執行這些測試,以確認庫的安裝是正確的且功能正常。此外,這些測試有利於將庫移植到新的編譯器。最後,這些測試提供了很多在用法舉例一節中沒有明確描述的函數的例子。
| 類型 | 說明 |
|---|---|
| 特性 | 更新了 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 標準庫中的缺陷。更多信息請見 郵件列表存檔。 |
| 類型 | 說明 |
|---|---|
| 缺陷修復 | 如果時間段的開始點和結束點相同或相連,則時間段長度的計算會有錯。在修正後,當開始點和結束點相同時,或者時間段以零時長創建時,現在將返回長度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 之間的轉換。還提供了將 FILETIME 和 time_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> |
| 缺陷修復 | 對於已不使用的 boost::tokenizer 接口,已升級為當前的接口。修正了在某些舊編譯器上的編譯錯誤。
|
| 缺陷修復 | 在遺留IO系統中的模板化格式化器接受 char 類型。同時刪掉了對 boost::lexical_cast 的調用。
|
| 類型 | 說明 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 缺陷修復 | 修正了 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 宏的不正確使用。 | ||||||||||||||||||
| 特性 | 為一些日期類增加了新的名字。原來的名字仍然可用,但以後可能會不再使用。改變如下:
|
||||||||||||||||||
| 特性 | 增加了日期生成器的自由函數。新增的函數是:days_until_weekday, days_before_weekday, next_weekday, 和
previous_weekday.
days days_until_weekday(date, greg_weekday);感謝 Bart Garst 所做的修改。 |
||||||||||||||||||
| 特性 | 為月數、年數和周數增加新的試驗用時長類型。這些類還提供了與日期和時間類的數學操作符。一個28日之後的時間或日期加上一定的月數或年數,可能會出現不正常的數學特性。這是由於這一運算採用了'月末'保持。以下例子示範了這一問題。
months m(12);這些類型的流輸入尚未實現。感謝 Bart Garst 所做的修改。 |
||||||||||||||||||
| 特性 | 統一 date_generators 的基類並帶入到 gregorian 名字空間中。請見 打印假日的例子。 | ||||||||||||||||||
| 特性 | 增加了 date 和 ptime 的缺省構造函數(兩者都有)以及特殊值的構造函數(ptime, 現在兩者均支持)。缺省構造函數將對像初始化為 not_a_date_time (NADT).
ptime p_nadt(not_a_date_time);感謝 Bart Garst 所做的修改。 |
||||||||||||||||||
| 特性 | 流輸出現在已可以在支持寬字符流的編譯器/標準庫組合上支持寬字符流。如以下代碼:
std::wstringstream wss;感謝 Bart Garst 所做的修改。 |
||||||||||||||||||
| 特性 | date 和 time 類型的流輸入現在已可以支持寬字符和窄字符流:
date d(not_a_date_time);感謝 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 進行構造的問題。這些情形下會構造出錯誤的值。 |
| 類型 | 說明 |
|---|---|
| 缺陷修復 | 更新了構建配置文件,現在可以用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 |
| 特性 | 為 日期生成器 類 - partial_date, first_kday_after, first_kday_before, 等等 - 增加了流輸出操作符。感謝 Bart Garst 的工作。 |
| 特性 | 為時長類型增加了單參數的 - 操作符,將時長的符號反轉。例如:
time_duration td(5,0,0); //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 所做的更新。 |
說明: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 |