我正在尝试使用 std::mktime
在 C++ 中将我作为 UTC 字符串接收的时间信息转换为时间戳。我的问题是在 <ctime>
/ <time.h>
没有转换为 UTC 的功能; mktime 只会将时间戳作为本地时间返回。
所以我需要弄清楚时区偏移量并将其考虑在内,但我找不到不涉及将整个代码移植到 boost::date_time
的独立于平台的方式。是否有一些我忽略的简单解决方案?
原文由 VolkA 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试使用 std::mktime
在 C++ 中将我作为 UTC 字符串接收的时间信息转换为时间戳。我的问题是在 <ctime>
/ <time.h>
没有转换为 UTC 的功能; mktime 只会将时间戳作为本地时间返回。
所以我需要弄清楚时区偏移量并将其考虑在内,但我找不到不涉及将整个代码移植到 boost::date_time
的独立于平台的方式。是否有一些我忽略的简单解决方案?
原文由 VolkA 发布,翻译遵循 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 许可协议
3 回答2.1k 阅读✓ 已解决
3 回答727 阅读✓ 已解决
3 回答3.6k 阅读
1 回答3.3k 阅读
1 回答1.1k 阅读✓ 已解决
1 回答2.2k 阅读
1 回答772 阅读✓ 已解决
mktime 假定日期值在本地时区。因此,您可以事先更改时区环境变量 (setenv) 并获取 UTC 时区。
Windows tzset
也可以试试看各种自制的 utc-mktimes、mktime-utcs等。