2012-03-03 2 views

ответ

2

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

+2

Это не стандарт, C, это POSIX. –

2

Извлечение части с 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); 
} 
0

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

1

Местное время или UTC? Если это UTC, самый простой способ сделать преобразование, чтобы избежать времени C API полностью и использовать формулу в 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.

Смежные вопросы