我有一个字符串,它应该以 ISO 8601 格式指定日期和时间,其中可能有也可能没有毫秒,我想从中获取 struct tm
以及任何可能的毫秒值已指定(如果字符串中不存在,则可以假定为零)。
检测字符串是否格式正确以及将用户指定的字符串转换为 struct tm
和毫秒值会涉及什么?
如果不是毫秒问题,我可能只使用 C 函数 strptime()
,但我不知道当秒包含小数点时该函数的定义行为应该是什么。
作为最后一个警告,如果可能的话,我非常喜欢一个不依赖于仅在 Boost 中找到的函数的解决方案(但我很高兴接受 C++11 作为先决条件)。
输入看起来像:
2014-11-12T19:12:14.505Z
或者
2014-11-12T12:12:14.505-5:00
Z
在这种情况下,表示 UTC,但可以使用任何时区,并将表示为与 GMT 的 + 或 - 小时/分钟偏移量。秒字段的小数部分是可选的,但它可能存在的事实就是为什么我不能简单地使用 strptime()
或 std::get_time()
,它们没有描述任何特定的定义行为如果在字符串的秒部分中找到这样的字符。
原文由 markt1964 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
C
的sscanf
( http://www.cplusplus.com/reference/cstdio/sscanf/ )来解析它:如果您有
std::string
可以这样调用( http://www.cplusplus.com/reference/string/string/c_str/ ):如果它应该处理不同的时区,您需要使用
sscanf
返回值 - 解析参数的数量:然后你可以填写
tm
( http://www.cplusplus.com/reference/ctime/tm/ )结构:它也可以用
std::get_time
( http://en.cppreference.com/w/cpp/io/manip/get_time )来完成,因为C++11
正如@Barry在评论中提到的 如何做我将 iso 8601 日期(可选毫秒)解析为 C++ 中的 struct tm?