Учитывая time_t
как 1291121400
, как я могу получить дату этого дня, отформатированную как 20101130
?Как получить iso_date (YYYYMMDD) от time_t/timeval
ответ
Следующая работал для меня:
int iso_date_from_time_t (const time_t & in_time_t_)
{
tm temp_this_tm_;
{ // the following to set local dst fields of struct tm ?
time_t tvsec_ = time(NULL);
localtime_r (& tvsec_, & temp_this_tm_) ;
}
localtime_r (& in_time_t, & temp_this_tm_) ;
return ((((1900 + temp_this_tm_.tm_year) * 100 + (1 + temp_this_tm_.tm_mon)) * 100) + temp_this_tm_.tm_mday) ;
}
Спасибо за вашу помощь.
Используйте функции gmtime
или localtime
и strftime
.
Использование gmtime(3)
или localtime(3)
, чтобы преобразовать его в struct tm
(Или, лучше, версии возвратные gmtime_r
или localtime_r
), а затем использовать strftime(3)
, чтобы превратить его в строку. Например, если вы хотите вывод в формате UTC:
struct tm tm;
char buf[9];
gmtime_r(&my_time_t, &tm);
strftime(buf, sizeof(buf), "%Y%m%d", tm);
printf("The date is: %s\n", buf);
Я надеюсь, вы будете работать над ошибкой переполнения буфера Y10K между теперь и, о, допустим, 9000-01-01? –
Ну, strftime берет размер буфера, поэтому он будет обрезать результат, а не переполнять буфер, по крайней мере. – nelhage
void function()
{
time_t current_time;
struct tm *struct_time;
time(¤t_time);
struct_time = gmtime(¤t_time);
/* Now, you can get the ISO date by
* YYYY 'struct_time->tm_year+1900'
* MM 'struct_time->tm_mon+1'
* DD 'struct_time->tm_mday' */
}
Пожалуйста, смотрите внутри 'структура тм' структуру.
Он мог бы скомпилировать, но он не дал вам ответ, который требуется. Год хранится '- 1900'; месяц основан на 0. Вы не компенсировали ни один из этих причуд. Вы также обнулили поля времени, но это не имеет значения, поскольку вы их не используете. –
Ведущие и завершающие символы подчеркивания являются уродливыми, а пограничная строка выходит за пределы домена имен, зарезервированных для пользователя; Я бы не использовал такие имена и не позволял добавлять такие имена в систему, где я просматривал код. Непонятно, почему у вас есть два вызова «localtime_r»: второго достаточно. Это 7 избыточных непустых строк. –
@JonathanLeffler Спасибо. Каким-то образом ответ казался правильным, как я его испытал в первый раз. Но, очевидно, ответ был неправильным. Сделал предложения, как вы предложили и протестировали их. Кажется совершенным до сих пор. Я пытаюсь сделать localtime_r дважды, чтобы установить dst-поля. То, что я хочу достичь, независимо от сегодняшней даты, если входное время_t соответствует дате, на которой dst действовал в локальном часовом поясе, тогда ответ должен знать об этом? –