LINUX.ORG.RU

Хочу прибавить несколько секунд ко времени, выраженному в struct tm. Иногда время уезжает на час. mktime, ++time, localtime. OK?


0

1

Я делаю:
1. Преобразовать в time_t (mktime)
2. Добавить неск. секунд.
3. Преобразовать обратно в struct tm (localtime).

При тестах на одной из машин после пункта (3) время уехало на час (назад или вперёд не помню). Всё ли я грамотно делаю с точки зрения желательности невмешательства влияния часовых поясов на всю процедуру? Если я делаю криво, посоветуйте лучший вариант.

Спасибо!

★☆

Последнее исправление: kiverattes (всего исправлений: 1)
1. добавить несколько секунд в член структуры tm_sec (адрес структуры - аргумент для mktime)
2. проверить возврат функции mktime()на != -1
а уж нормализацию из (например)11:59:61 в 12:00:01 mktime сделает сама
cool-e-bin
()

У меня есть подозрение что задача изначально неверная.

Откуда у тебя приходит struct_tm ?!

Особенно клёво происходит на границе смены времени. т.е. после 23:59:59 + 10 sec можешь получить 23:00:09. И вот как раз tm_isdst и показывает - ты уже до или после :). Так и вот. Если нехороший чел изначально неверно проставил это поле - то как раз таки на час будет ошибка.

mmarkk
()
Ответ на: комментарий от mmarkk

struct tm приходит от юзера. Но юзер передаёт мне ещё одно поле - «добавка в миллисекундах». На это количество времени (выраженное в миллисекундах) мне нужно сместить вперёд время, выраженное в struct tm.

kiverattes ★☆
() автор топика
Ответ на: комментарий от mmarkk

Читаем маны, раздел ЗАМЕЧАНИЯ:

Функции asctime(), ctime(), gmtime() и localtime() возвращают указатели на статические данные и небезопасны с точки зрения подпроцессов (threads). Безопасными являются их аналоги asctime_r(), ctime_r(), gmtime_r() и localtime_r(), введенные в SUSv2 и повившееся в libc 5.2.5.

т.е. в многопоточном приложении вместо localtime() необходимо использовать localtime_r(), другое дело что для данной конкретной задачи localtime() не нужен, mktime() может сделать всё сама.

cool-e-bin
()
Ответ на: комментарий от kiverattes

time_t mktime(struct tm *tm);

аргумент этой функции - указатель на структуру tm, структура tm - одновременно и входной и выходной параметр, и вообще, надо читать документацию, а потом спрашивать:

Функция mktime() преобразует время в календарном представлении в абсолютное время. Функция игнорирует содержимое полей структуры tm_wday и tm_yday и пересчитывает их значения в соответствии с другими элементами структуры. Если значения элементов структуры выходят за пределы допустимых значений, то они «нормализуются» (так, например, 40 октября превращается в 9 ноября). Вызов mktime() также присваивает внешней переменной tzname значение текущей временной зоны. Если локальное время не может быть представлено как календарное (число секунд с начала века), то mktime() возвращает значение (time_t)(-1) и не изменяет значения членов структуры локального времени tm_wday и tm_yday.

cool-e-bin
()
Ответ на: комментарий от cool-e-bin

Не знал про нормализацию. Английский в манах суровее, чем в жизни.

kiverattes ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.