2012-02-13 2 views
4

Я хотел бы получить временную отметку unix начала текущего (или любого заданного часа) в c/C++.Получить текущий час unix timestamp

У меня есть это:

 

    time_t get_current_hour() { 
     time_t beginning_of_hour; 
     struct tm * ptm; 

     time(&beginning_of_hour); 

     ptm = gmtime(&beginning_of_hour); 
     ptm->tm_min = 0; 
     ptm->tm_sec = 0; 
     ptm->tm_zone = (char*) "GMT"; 

     beginning_of_hour = mktime(ptm); 

     return beginning_of_hour; 
    } 

Который работает, но при высокой нагрузке многие из результата не начало текущего часа, но фактическое время.

Есть ли лучший способ решить эту проблему? Почему функция возвращает текущее время?

Пожалуйста, посоветуйте, Акос

ответ

1

Возможно, у вас многопоточное приложение, а звонки на gmtime не являются потокобезопасными (повторными). Если это так, попробуйте использовать повторную версию: gmtime_r

+0

Ну, у вас есть точка. Приложение действительно многопоточно. Спасибо, я буду использовать gmtime_r. – Akos

6

Вы можете сделать все это с time_t, не нарушая его на части и восстановление.
Просто округлить вниз к кратному 3600:

time_t get_current_hour(void) { 
    time_t now; 
    time(&now); 
    return now - (now % 3600); 
} 

Возможно, это не приятно рассматривать time_t как целое. Но я думаю, что с эпохи будет гарантировано секунд, так что все должно быть хорошо.

+0

+1, лучший ответ, чем мой! – Nim

+0

'time_t' гарантируется только числовым типом, поэтому он может быть« double »(не то, что я когда-либо видел). –

+0

@JamesKanze: Это будет играть ад в точности за пару тысяч лет, когда мы начнем проигрывать последние пару бит int. –

0

Является ли ваше приложение случайным многопоточным? gmtime возвращает указатель на статическую память, которая будет перезаписана при следующем вызове функции . Такие функции не являются потокобезопасными (и это о том, что я могу думать о том, что будет учитывать ваши симптомы ). В Unix также есть gmtime_r, который позволяет вам объявить локальный буфер и избежать проблемы; Windows имеет _gmtime_s , который (я думаю) аналогичен.

+0

Благодарим вас за ответ, вы правы. Приложение многопоточное, я буду использовать gmtime_r – Akos

Смежные вопросы