Строка «2012-03-02», представляющая 2 марта 2012 года, предоставляется мне как входная переменная (char *).Как преобразовать «2012-03-02» в эпоху unix в C?
Как мне преобразовать эту дату в эпоху unix в языке программирования C?
Строка «2012-03-02», представляющая 2 марта 2012 года, предоставляется мне как входная переменная (char *).Как преобразовать «2012-03-02» в эпоху unix в C?
Как мне преобразовать эту дату в эпоху unix в языке программирования C?
C (POSIX) обеспечивает функцию для этого. Используйте strptime()
, чтобы преобразовать строку в значение struct tm
. Затем вы можете преобразовать struct tm
в time_t
, используя mktime()
.
Извлечение части с 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);
}
Прочти в struct tm
и вызвать mktime
, чтобы получить time_t
.
Местное время или 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
.
Это не стандарт, C, это POSIX. –