c - 如何在纯 ISO C 中计算时代的 time_t?

标签 c time timezone

只使用 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:00struct tm 上调用 mktime。这可以合理地返回 -1,在这种情况下将其视为 0。
  • 在两者之间二进制搜索 time_t 的值,当传递给 gmtime 时,结果为 01 Jan 1970 00:00:00

假设本地时间与 UTC 的时差不会超过 24 小时,我很确定这是事实。如有必要,我们可以扩大边界,在极端情况下,我们可以在 0time(0) 之间搜索。

二进制搜索可以改进,例如通过插值。但谁知道呢,也许一些疯狂的时区(或损坏的 tzinfo 数据)可能会导致 12 月/1 月的夏令时变化。我怀疑任何实时区域都会发生这种情况。但 C 标准并没有禁止,只是常识禁止。

如果不是那样的话,我想我们可以根据 gmtime(mktime(01 Jan)) 来计算(以获取时区)和 1970 年 1 月 1 日的比较00:00:001970 年 1 月 1 日 00:00:01(以获得 time_t 的精度)。

关于c - 如何在纯 ISO C 中计算时代的 time_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957667/

相关文章:

java - 乔达时区计算

entity-framework - 我们如何通过 Breeze 使用本地时区生存

使用 VS 工具和 Tup 构建系统编译

c - 这个C代码片段是什么意思?

c# - Xamarin iOS 11.2 中的 Environment.TickCount 替代方案

javascript - 在javascript中获取没有时间的日期ISO字符串

javascript - 如何使用 JavaScript AWS IAM SDK 3 处理限制?

C 函数 : assign unsigned variable to a function with a signed parameter

分别从 stdin/stdout 读取/写入时 CGI 程序超时

r - 从 UTC 时间获取本地时间