主要观点:处理时间相关操作在 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_gmtoff
、tm_zone
和tm_isdst
定义不清晰且使用时会变化。- 不同平台的相关函数情况,如 Windows 中
timegm()
可用作mkgmtime()
,AIX 需单独实现timegm()
。 - 多线程程序不能更改环境变量,
setlocale()
在多线程中不安全。 - C++的时区数据库可支持多种操作,如精确计算飞机飞行时间等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。