Как преобразовать строку ISO 8601 в time_t в С++?

Кто-нибудь знает, как перейти от ISO-8601 - форматированная строка даты/времени к time_t? Я использую С++, и он должен работать на Windows и Mac.

Я написал код, но я уверен, что есть версия, более стандартная.

Я получаю дату как 2011-03-21 20:25, и я должен сказать, прошло ли время в прошлом или в будущем.

Ответ 1

Один уродливый взлом, который я думал, будет забавным: поскольку вы только хотите определить, какая дата/время больше, вы можете преобразовать дату в строку и сравнить строки.;-) (Поверхность - вам не нужна 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;
}

Ответ 2

Вы можете использовать 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.