2011-02-06 3 views

ответ

0

Следующая работал для меня:

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) ; 
} 

Спасибо за вашу помощь.

+1

Он мог бы скомпилировать, но он не дал вам ответ, который требуется. Год хранится '- 1900'; месяц основан на 0. Вы не компенсировали ни один из этих причуд. Вы также обнулили поля времени, но это не имеет значения, поскольку вы их не используете. –

+0

Ведущие и завершающие символы подчеркивания являются уродливыми, а пограничная строка выходит за пределы домена имен, зарезервированных для пользователя; Я бы не использовал такие имена и не позволял добавлять такие имена в систему, где я просматривал код. Непонятно, почему у вас есть два вызова «localtime_r»: второго достаточно. Это 7 избыточных непустых строк. –

+0

@JonathanLeffler Спасибо. Каким-то образом ответ казался правильным, как я его испытал в первый раз. Но, очевидно, ответ был неправильным. Сделал предложения, как вы предложили и протестировали их. Кажется совершенным до сих пор. Я пытаюсь сделать localtime_r дважды, чтобы установить dst-поля. То, что я хочу достичь, независимо от сегодняшней даты, если входное время_t соответствует дате, на которой dst действовал в локальном часовом поясе, тогда ответ должен знать об этом? –

0

Используйте функции gmtime или localtime и strftime.

5

Использование 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); 
+0

Я надеюсь, вы будете работать над ошибкой переполнения буфера Y10K между теперь и, о, допустим, 9000-01-01? –

+0

Ну, strftime берет размер буфера, поэтому он будет обрезать результат, а не переполнять буфер, по крайней мере. – nelhage

0
void function() 
{ 
    time_t  current_time; 
    struct tm *struct_time; 

    time(&current_time); 

    struct_time = gmtime(&current_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' */ 
} 

Пожалуйста, смотрите внутри 'структура тм' структуру.