std::mktime 和时区信息

新手上路,请多包涵

我正在尝试使用 std::mktime 在 C++ 中将我作为 UTC 字符串接收的时间信息转换为时间戳。我的问题是在 <ctime> / <time.h> 没有转换为 UTC 的功能; mktime 只会将时间戳作为本地时间返回。

所以我需要弄清楚时区偏移量并将其考虑在内,但我找不到不涉及将整个代码移植到 boost::date_time 的独立于平台的方式。是否有一些我忽略的简单解决方案?

原文由 VolkA 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

mktime 假定日期值在本地时区。因此,您可以事先更改时区环境变量 (setenv) 并获取 UTC 时区。

Windows tzset

也可以试试看各种自制的 utc-mktimes、mktime-utcs等。

原文由 Anonymous 发布,翻译遵循 CC BY-SA 4.0 许可协议

As other answers note, mktime() (infuriatingly) assumes the tm struct is in the local timezone (even on platforms where tm has a tm_gmtoff 字段),并且没有 标准 的跨平台方式将您的 tm 解释为 GMT。

不过,以下是合理的跨平台——它适用于 macOS、Windows(至少在 MSVC 下)、Linux、iOS 和 Android。

 tm some_time{};
... // Fill my_time

const time_t utc_timestamp =
    #if defined(_WIN32)
        _mkgmtime(&some_time)
    #else // Assume POSIX
        timegm(&some_time)
    #endif
;

原文由 s3cur3 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题