Как преобразовать «2012-03-02» в эпоху unix в C?

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

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

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

Извлеките fragmentы с помощью sscanf , sscanf struct tm (from ) с извлеченными данными и, наконец, используйте 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); } 

Местное время или 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 .

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