Как мне преобразовать «2012-03-02» в эпоху Unix в C? - PullRequest
6 голосов
/ 03 марта 2012

Строка «2012-03-02», представляющая 2 марта 2012 года, передана мне в качестве входной переменной (char *).

Как мне преобразовать эту дату в эпоху Unix на языке программирования C?

Ответы [ 4 ]

3 голосов
/ 03 марта 2012

Извлеките фрагменты с помощью sscanf, заполните struct tm (из <time.h>) извлеченными данными и, наконец, используйте mktime, чтобы преобразовать их в time_t.

time_t ParseDate(const char * str)
{
    struct tm ti={0};
    if(sscanf(str, "%d-%d-%d", &ti.tm_year, &ti.tm_mon, &ti.tm_day)!=3)
    {
        /* ... error parsing ... */
    }
    ti.tm_year-=1900
    ti.tm_mon-=1
    return mktime(&ti);
}
2 голосов
/ 03 марта 2012

Местное время или UTC?Если это UTC, самый простой способ сделать это - полностью избежать API времени C и использовать формулу в POSIX в течение нескольких секунд с начала эпохи:

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

Источник: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

Если это местное время, проблема превращается в ад из-за того, что time_t не гарантируется быть представленным в секундах с начала эпохи, за исключением систем POSIX, и из-за того, что трудно вычислить значение time_t, соответствующееэпоха (mktime не будет работать, потому что она использует местное время).Однако, как только вы вычислили time_t для эпохи, нужно просто использовать mktime для значения времени, которое вы проанализировали, и затем вызвать difftime.

2 голосов
/ 03 марта 2012

C (POSIX) предоставляет функцию для этого. Используйте strptime() для преобразования строки в значение struct tm. Затем вы можете преобразовать struct tm в time_t, используя mktime().

0 голосов
/ 03 марта 2012

Прочитайте его в struct tm и позвоните mktime, чтобы получить time_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...