Строка «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
.