【发布时间】:2019-06-10 16:09:58
【问题描述】:
将 ISO8601 日期时间解析为 time_t 的正确方法是什么?
输入字符串是 ISO8601 日期时间的特定变体:
1991-02-03T04:05:06.000-07:00
(我不需要担心“Z”或隐含的本地时间变体)
我可以使用strptime() 来解析小数秒,但手册页提到了setlocale(),所以我担心我需要对此做些什么。 是吗? 还是仅适用于月份和日期名称?
似乎没有任何方法可以跳过(或处理)strptime 中的小数秒,而且我的版本似乎也不支持“%z”(而且tm_gmtoff 是非标准的),所以我被困在“手动”解析输入的小数秒和时区偏移量。很简单。
所以我假设我可以修改从 strptime 获得的 tm_min 与 TZ 偏移的分钟数。 正确吗?
然后我们来到mktime()。看来强制它在 UTC 中运行的预期方法是:
获取 TZ,清除 TZ,
tzset(),mktime(),重置 TZ,tzset()
(有一个timegm(),但不是标准的)
我要处理很多这些字符串,我不关心这个程序中的任何其他时间处理,所以这似乎是很多毫无价值的开销,我可以清除 TZ 和 @987654330 @ 开头一次?
【问题讨论】:
-
请记住,
time_t通常是整数类型,并且会计算整秒。分数与它并不真正相关。 -
是的,在这种情况下我不关心小数秒,但未来的读者可能会使用
struct timespec或类似的,所以我想我会说跳过 或处理.