Используются функции и структуры данных заголовочного файла time.h
Дано: текущее время (количество секунд - unix-time, короче).
Требуется: получить unix-time на ЭТО ЖЕ время, но на следующий день.
С учётом переводов на летнее-зимнее время.
Кто как это делает?
"Вводная", так сказать:
Сначала (пока не столкнулся с ошибкой) я делал просто: прибавлял 24*60*60 секунд к unix-time'у.
Но при осеннем переводе времени у меня получилось, что событие (которому я сопоставил это время) отработало на час раньше.
Я перевёл эти секунды в struct tm - действительно час получился меньше.
Тогда я попробовал работать с этой же структурой: у неё для дней предусмотрено 3 поля (tm_wday, tm_mday и tm_yday)
Получаю текущее время, перевожу его в tm, прибавляю день и перевожу обратно в секунды.
Если прибавить к tm_wday или к tm_yday, то вообще ничего не меняется - те же самые секунды, будто день и не прибавлял.
Если же прибавить день к tm_mday, то повторяется ошибка с одним часом: осенью на час раньше, весной - на час позже.
Пока решил по-извращенски:
прибавляю день к tm_mday, преобразую в unix-time, потом обратно в tm, устанавливаю нужный час и преобразую назад в unix-time.
Криво как-то, но работает.
Так вот вопрос: может у кого более красивое решение есть?
Вычисление секунд "на завтра".
Модератор: Модераторы разделов
-
d_Sun
- Сообщения: 291
Re: Вычисление секунд "на завтра".
Код: Выделить всё
void get_tomorrow_date( struct timeval *date )
{
sleep( 86400 ); // 60 * 60 * 24
gettimeofday( date, 0 );
}Моя подпись сильно длинная :)
-
Sniff
- Сообщения: 330
- ОС: Debian Lenny
Re: Вычисление секунд "на завтра".
Zeus почему криво-то? Нормально, в духе настоящих программистов 
кстати священное число 86400 должен знать каждый
кстати священное число 86400 должен знать каждый
-
Zeus
- Сообщения: 694
-
Kirill Frolov
- Сообщения: 6
- ОС: Debian
Re: Вычисление секунд "на завтра".
Zeus писал(а): ↑17.09.2006 22:56Используются функции и структуры данных заголовочного файла time.h
Дано: текущее время (количество секунд - unix-time, короче).
Требуется: получить unix-time на ЭТО ЖЕ время, но на следующий день.
С учётом переводов на летнее-зимнее время.
Но при осеннем переводе времени у меня получилось, что событие (которому я сопоставил это время) отработало на час раньше.
Бугага. В сутках, в общем случае, не 86400 секунд. И зависит это, от чего угодно,
вплоть до отдельного на это решения ЦК партии и лично Генерального Секретаря.
Надо понимать.
Пока решил по-извращенски:
прибавляю день к tm_mday, преобразую в unix-time, потом обратно в tm, устанавливаю нужный час и преобразую назад в unix-time.
Как вариант -- сформатировать в ISO-8601 (strftime), распарсить его, прибавить там день (скорректировав месяц и год -- что не так уж и тривиально), распарсить обратно (strptime).
Так вот вопрос: может у кого более красивое решение есть?
Вряд ли.