gpt4 book ai didi

c - 如何将 UTC 日期转换为 time_t

转载 作者:行者123 更新时间:2023-12-05 05:17:52 24 4
gpt4 key购买 nike

我想将描述 UTC 日期的 struct tm 转换为 time_t 值。我该怎么做?

C 库有 mktime() 函数,但 AFAICS 它不适合这项工作,因为它将 local 时间转换为 time_t .

那么将存储在 struct tm 中的 UTC 日期转换为 time_t 值的建议方法是什么?我是否必须使用 mktime() 然后手动应用时区偏差,或者是否有专门的 C 函数来完成这项工作?

最佳答案

下面是我的做法:

  1. 假装更了解 tm 结构保存本地时间(非 DST,如果有人问;没关系,但必须与步骤 3 一致),将其转换为 time_t
  2. 将日期转换回 tm 结构,但这次采用 UTC 表示形式。
  3. 假装反对更好的知识that tm 结构也保持本地(非 DST,如果有人问,但更重要的是与步骤 1 一致),并将其转换为 time_t 再一次。
  4. 根据这两个 time_t 结果,我现在可以以 time_t 为单位计算本地时间(非 DST,如果有人问的话)和 UTC 之间的差异。
  5. 将这个差异添加到第一个 time_t 结果中,我得到了正确的 UTC 时间。

复杂,但我相信它应该有效。除非计算机使用基于 TAI 的时钟,在这种情况下,在极少数情况下结果可能会偏差一秒。一致的 DST 设置(而不是让 mktime 自动检测它)是必要的,这样我在尝试计算接近 DST 期间开始或结束的日期/时间时不会被整整一个小时甩掉。

tm tt;
// populate tt here
tt.tm_isdst = 0;
time_t tLoc = mktime(&tt);
tt = *gmtime(&tLoc);
tt.tm_isdst = 0;
time_t tRev = mktime(&tt);
time_t tDiff = tLoc - tRev;
time_t tUTC = tLoc + tDiff;

但是,这种方法需要注意 gmtime() 不是线程安全的。因此,如果有人有更好的解决方案,我很乐意听听。

关于c - 如何将 UTC 日期转换为 time_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48566198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com