13.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 日期”, 这可以支持更宽的时间范围。处理Julian 日期的代码可以在以下地方找到: Snippets 收集(参见问题18.16);Simtel/Oakland 站点(文件JULCAL10.ZIP, 参见问题18.18) 和文献中提到的文章“Date conversions” [Burki]。
但是, 这些方法只有日期在time t 表达范围内才保证工作正常。对于保守的time t, 通常范围是从1970 年到大约2037 年; 注意有些time t 的表达不是按照Unix 和Posix 标准的。tm mday 域是个int, 所以日偏移量超出32,736 就会上溢。还要注意, 在夏令时转换的时候, 一天并不是24 小时, 所以不要假设可以用86400 整除。
另一个解决的方法是用“Julian 日期”, 这可以支持更宽的时间范围。处理Julian 日期的代码可以在以下地方找到: Snippets 收集(参见问题18.16);Simtel/Oakland 站点(文件JULCAL10.ZIP, 参见问题18.18) 和文献中提到的文章“Date conversions” [Burki]。