只使用 C 标准库(纯 ISO C,无 POSIX,因此不假设 time_t
以“自纪元以来的秒数”表示),获得 a 的最简单方法是什么time_t
值对应于 01 Jan 1970 00:00:00 UTC?
UTC部分是关键;否则,只需在正确初始化的 struct tm
上使用 mktime
即可轻松解决问题。
或者(这实际上是问题的“要点”),如何可移植地确定给定 time_t
值之间的 POSIX 秒数,例如通过time(0)
获取的当前时间,以及纪元? “POSIX 秒”是指 POSIX 的“纪元以来的秒数”中使用的定义,它不使用闰秒。如果这听起来太复杂,请回到第一段中最初提出的问题,并假设时代可以用 time_t
表示。
最佳答案
这是一个实现方法的条目,“最简单”,如果没有人能打败它的话:
- 在
struct tm
上调用mktime
1970 年 1 月 2 日 00:00:00
- 在
1969 年 12 月 31 日 00:00:00
的struct tm
上调用mktime
。这可以合理地返回 -1,在这种情况下将其视为 0。 - 在两者之间二进制搜索
time_t
的值,当传递给gmtime
时,结果为01 Jan 1970 00:00:00
假设本地时间与 UTC 的时差不会超过 24 小时,我很确定这是事实。如有必要,我们可以扩大边界,在极端情况下,我们可以在 0
和 time(0)
之间搜索。
二进制搜索可以改进,例如通过插值。但谁知道呢,也许一些疯狂的时区(或损坏的 tzinfo 数据)可能会导致 12 月/1 月的夏令时变化。我怀疑任何实时区域都会发生这种情况。但 C 标准并没有禁止,只是常识禁止。
如果不是那样的话,我想我们可以根据 gmtime(mktime(01 Jan))
来计算(以获取时区)和 1970 年 1 月 1 日的比较00:00:00
与 1970 年 1 月 1 日 00:00:01
(以获得 time_t
的精度)。
关于c - 如何在纯 ISO C 中计算时代的 time_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957667/