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

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

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

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


person reza    schedule 21.03.2011    source источник
comment
Аналогичное обсуждение кроссплатформенного strptime здесь. Вам может понадобиться ответ ravenspoint и используйте boost: #include "boost/date_time/posix_time/posix_time.hpp"   -  person Tim    schedule 22.03.2011


Ответы (3)


Один уродливый хак, который, как мне показалось, будет забавным: поскольку вы хотите только определить, какая дата/время больше, вы можете преобразовать дату в строку и сравнить строки. ;-) (Преимущество в том, что вам не нужен 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;
}
person Mormegil    schedule 21.03.2011
comment
Хотя я инстинктивно съеживаюсь при такой идее ... в этом суть формата ГГГГММДД ЧЧММСС - сравнения ascii действительно работают. Риск, конечно, в том, что в будущем он начнет получать даты в другом формате. - person Tim; 22.03.2011

Вы можете использовать strptime для преобразования строки в struct tm, а затем использовать < href="http://linux.die.net/man/3/mktime" rel="nofollow">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.
person Adam Rosenfield    schedule 21.03.2011
comment
strptime не является стандартным c. Будет ли он доступен в Windows? - person Null Set; 22.03.2011
comment
@Null Set: Ой, ты прав, забыл об этом. strptime определяется только POSIX. См. stackoverflow.com/questions/321849/ и stackoverflow.com/questions/667250/strptime-in-windows . - person Adam Rosenfield; 22.03.2011

Если отметка времени находится в местном часовом поясе, следующий метод преобразует 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;
}
person Peter Kofler    schedule 01.05.2020