问题 如何在C ++中将ISO 8601字符串转换为time_t?


有谁知道如何从一个 ISO-8601格式化日期/时间字符串到 time_t? 我正在使用C ++,它需要在Windows和Mac上运行。

我编写了代码,但我确信有一个更“标准”的版本。

我会得到一个日期 2011-03-21 20:25 而且我必须告诉时间是过去还是将来。


5938
2018-03-21 20:44


起源

有一个关于跨平台的类似讨论 strptime  这里。您可能需要ravenspoint的答案,并使用boost: #include "boost/date_time/posix_time/posix_time.hpp" - Tim


答案:


我认为一个丑陋的黑客很有趣:因为你只想确定哪个日期/时间更大,你可以将日期转换为字符串并比较字符串。 ;-)(好处是你不需要strptime,这在任何地方都无法获得。)

#include <string.h>
#include <time.h>

int main(int argc, char *argv[])
{
    const char *str = "2011-03-21 20:25";
    char nowbuf[100];
    time_t now = time(0);
    struct tm *nowtm;
    nowtm = localtime(&now);
    strftime(nowbuf, sizeof(nowbuf), "%Y-%m-%d %H:%M", nowtm);
    if (strncmp(str, nowbuf, strlen(str)) >= 0) puts("future"); else puts("past");
    return 0;
}

7
2018-03-21 20:58



虽然我本能地畏缩于这样的想法......这就是“YYYYMMDD HHMMSS”格式的重点 - ascii比较实际上是有效的。当然,风险在于他将来会以不同的格式开始约会。 - Tim


您可以使用 strptime 从字符串转换为 struct tm,然后你可以使用 mktime 从...转换 struct tm 到了 time_t。例如:

// Error checking omitted for expository purposes
const char *timestr = "2011-03-21 20:25";
struct tm t;
strptime(timestr, "%Y-%m-%d %H:%M", &t);
time_t t2 = mktime(&t);
// Now compare t2 with time(NULL) etc.

6
2018-03-21 20:54



strptime不是标准c。它可以在Windows上使用吗? - Null Set
@Null Set:哎呀你是对的,忘记了。 strptime 仅由POSIX定义。看到 stackoverflow.com/questions/321849/... 和 stackoverflow.com/questions/667250/strptime-in-windows 。 - Adam Rosenfield