基礎知識 | 每日一練(124)

  • 2019 年 10 月 6 日
  • 筆記

基礎知識練習

讀者:怎樣在日期上加 N 天?怎樣取得兩個日期的時間間隔?

小林:ANSI/ISO 標準 C 函數 mktime() 和 difftime() 對這兩個問題提供了一些有限的支援。

mktime() 接受沒有規格化的日期, 所以可以用一個日期的 struct tm 結構, 直接在 tm mday 域進行加或減, 然後調用 mktime() 對年、月、日域進行規格化, 同時也轉換成了 time t 值。

可以用 mktime() 來計算兩個日期的 time t 值, 然後用 difftime() 計算兩個 time t 值的秒數差分。

但是, 這些方法只有日期在 time t 表達範圍內才保證工作正常。對於保守的 time t, 通常範圍是從 1970 年到大約 2037 年; 注意有些 time t 的表達不是按照 Unix 和 Posix 標準的。

tm mday 域是個 int, 所以日偏移量超出 32,736 就會上溢。還要注意, 在夏令時轉換的時候, 一天並不是 24 小時, 所以不要假設可以用86400 整除。

另一個解決的方法是用 「Julian 日期」, 這可以支援更寬的時間範圍。