【问题标题】:How do I convert an ISO 8601 string to time_t in C++?如何在 C++ 中将 ISO 8601 字符串转换为 time_t?
【发布时间】:2011-07-19 23:59:07
【问题描述】:

有谁知道如何将ISO-8601 格式的日期/时间字符串转换为time_t? 我正在使用 C++,它需要在 Windows 和 Mac 上运行。

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

我会得到一个像2011-03-21 20:25 这样的日期,我必须知道时间是过去还是未来。

【问题讨论】:

  • 关于跨平台的strptimehere也有类似的讨论。您可能需要 ravenspoint 的答案,并使用 boost:#include "boost/date_time/posix_time/posix_time.hpp"

标签: c++ time iso time-t


【解决方案1】:

我认为一个丑陋的 hack 会很有趣:因为您只想确定哪个日期/时间更大,您可以将日期转换为字符串并比较字符串。 ;-) (好处是你不需要 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;
}

【讨论】:

  • 虽然我本能地对这样的想法感到畏缩......这就是“YYYYMMDD HHMMSS”格式的重点 - ascii 比较确实有效。当然,风险在于他将来是否开始以不同的格式获取日期。
【解决方案2】:

您可以使用strptime 将字符串转换为struct tm,然后您可以使用mktimestruct 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.

【讨论】:

【解决方案3】:

如果时间戳在本地时区,以下方法会将 ISO8601 转换为 UTC。它也没有忽略潜在的夏令时。它是标准的 C99。

#include <stdio.h>
#include <time.h>

time_t from_iso8601_utc(const char* dateStr)
{
    struct tm t;
    int success = sscanf(dateStr, "%d-%d-%dT%d:%dZ", /* */
                         &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min);
    if (success != 5) {
        return 0;
    }

    /* compensate expected ranges */
    t.tm_year = t.tm_year - 1900;
    t.tm_mon = t.tm_mon - 1;
    t.tm_sec = 0;
    t.tm_wday = 0;
    t.tm_yday = 0;
    t.tm_isdst = 0;

    time_t localTime = mktime(&t);
    time_t utcTime = localTime - timezone;
    return utcTime;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多