Как перевести struct tm в time_t с учетом перехода на летнее время?

Как перевести struct tm в time_t с учетом перехода на летнее время?

26.10.2011 01:41:30 Просмотров 33 Источник

Столкнулся с задачей: есть какая-то дата, нужно посчитать разницу в секундах между этой датой и текущим временем системы. Т.е мне надо узнать число секунд с начала эпохи до текущего момента, потом до нужной мне даты и вычесть одно из другого. Проблема в том, что нужно еще учитывать переход на зимнее/летнее время.

Пример: На машине /etc/localtime ссылается на /usr/share/zoneinfo/Europe/Bucharest, там у них переход на час вперед в 3:00. Допустим, сейчас 27 марта 2011 года, 02:10. Мне нужно установить дату 5:10; если бы это был обычный день, то разница во времени составила бы три часа. Но, в после 2:59:59 наступит сразу 4:00:00, поэтому реально разница между этими датами составляет два часа.

Время я храню в struct tm. Там есть поле tm_isdst которое вроде как отвечает за то, применяется ли перевод стрелок к заданной дате. Если в моем примере поставить tm_isdst =1, то localtime_r выдаст правильный результат. Но фокус в том, что для произвольно выбранной даты я не могу сказать, применяется ли к ней перевод стрелок :(

Что делать?

У вопроса есть решение - Посмотреть?

Ответы - Как перевести struct tm в time_t с учетом перехода на летнее время? / Как перевести struct tm в time_t с учетом перехода на летнее время?

IAZ

26.10.2011 01:47:30

Т.е. получается, что в день перехода на летнее время у Вас в сутках будет 25 часов?! Это же бред.

Разница во времени в часах не зависит от перехода на летнее и зимнее время. К тому же сейчас уже нет перехода в нашей стране.

https://ru.stackoverflow.com/questions/47020/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%b2%d0%b5%d1%81%d1%82%d0%b8-struct-tm-%d0%b2-time-t-%d1%81-%d1%83%d1%87%d0%b5%d1%82%d0%be%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d0%bd%d0%b0-%d0%bb%d0%b5%d1%82%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/47028#comment47034_47028
23 часа. Но в общем верно: если между двумя датами случился переход на зимнее время, надо один час добавить; если на летнее -- отнять. Если оба перехода -- они друг друга компенсируют и результат будет корректным. В мире еще осталась куча стран, где президенты не думают о своем народе :)
https://ru.stackoverflow.com/questions/47020/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%b2%d0%b5%d1%81%d1%82%d0%b8-struct-tm-%d0%b2-time-t-%d1%81-%d1%83%d1%87%d0%b5%d1%82%d0%be%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d0%bd%d0%b0-%d0%bb%d0%b5%d1%82%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/47028#comment48248_47028
уважаемый @beardog давайте хоть о политике не будем xD
Alex Kapustin

29.10.2011 03:50:58

Если брать время в unix timestamp то вычитывать разницу для перехода на летнее/зимнее время не нужно.

Является ответом!
Vladimir Vodolazkiy

30.10.2011 11:04:39

Попробуйте использовать вызов mktime(). В передаваемой ему структуре tm переменную tm_isdst установите равной -1. Тогда mktime сам определит - действовало ли для данного времени летнее время или нет.

https://ru.stackoverflow.com/questions/47020/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%b2%d0%b5%d1%81%d1%82%d0%b8-struct-tm-%d0%b2-time-t-%d1%81-%d1%83%d1%87%d0%b5%d1%82%d0%be%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d0%bd%d0%b0-%d0%bb%d0%b5%d1%82%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f/48449#comment48938_48449
спасибо, это оказалось именно то, что нужно было
Закрыть X