在 C 或 C++ 中从 UTC 字符串获取 Unix 纪元时间的惊人挣扎 - Bert Hubert 的著作

主要观点:处理时间相关操作在 C 和 C++中存在诸多问题,如 mktime()strptime()等函数的行为和规范不一致,时区处理困难等,但 C++20 有了更优的时区数据库等。
关键信息:

  • mktime()处理本地时间时,应将 tm_isdst设为 -1,使用后需重置,且会修改 struct tm;处理 UTC 时间时需先设时区为 UTC。
  • strptime()对 %z 和 %Z 的处理不明确,一般忽略它们可避免问题,且 strptime()的行为受当前 locale 影响。
  • C++的 iostreams 对 locales 处理更好,可通过设置 locale 解析 UTC 时间字符串,C++20 有豪华的时区数据库。
    重要细节:
  • 在阿姆斯特丹,由于夏令时,某些时间点不存在,如 2025 年 3 月 30 日 02:30 不存在。
  • struct tm字段含义及用法复杂,如 tm_gmtofftm_zonetm_isdst定义不清晰且使用时会变化。
  • 不同平台的相关函数情况,如 Windows 中 timegm()可用作 mkgmtime(),AIX 需单独实现 timegm()
  • 多线程程序不能更改环境变量,setlocale()在多线程中不安全。
  • C++的时区数据库可支持多种操作,如精确计算飞机飞行时间等。
阅读 8
0 条评论