Как мне преобразовать строку ISO 8601 в time_t в C ++? - PullRequest
11 голосов
/ 21 марта 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 21 марта 2011

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

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