主要观点:处理时间相关操作在 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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。