2014-11-17 3 views
0

У меня возникла интересная проблема с функцией mktime. Я использую русский часовой пояс (UTC + 03: 00) Волгоград, Москва, Санкт-Петербург (RTZ 2)/Волгоград, Москва, Санкт-Петербург/и попытаемся построить time_t для «7.01.2009 00:00:00»mktime сдвигает время на один час

tm localTM; 

localTM.tm_sec = 0; 
localTM.tm_min = 0; 
localTM.tm_hour = 0; 
localTM.tm_mday = 7; 
localTM.tm_mon = 0; 
localTM.tm_year = 109; 

time_t t = mktime(&localTM); 

После mktime даты исполнения & время сменится на "6.01.2009 23:00:00".

У меня нет проблем, тогда я создаю время для «06.01.2009 00:00:00» или «08.01.2009 00:00:00». Если я переключу часовой пояс на другой, у меня не возникнет проблем с «7.01.2009 00:00:00».

Что может быть причиной этой странности и как я могу решить эту проблему?

+0

Слишком много изменений правил в России, они просто перешли от UTC + 4 до UTC + 3 на 26 октября. Насколько хорошо ваша операционная система может отслеживать правила, неясно, когда вы не укажете, какую версию вы используете, и обновляете ли вы ее. –

+0

Я использую Windows 7 Professional, все последние обновления установлены –

ответ

0

При выполнении преобразования в time_t, mktime необходимо угадать, является ли вход DST (летнее время) или нет. Для этого используется поле tm.tm_isdst. Смотрите с man mktime

tm_isdst A flag that indicates whether daylight saving time is in 
      effect at the time described. The value is positive if day- 
      light saving time is in effect, zero if it is not, and nega- 
      tive if the information is not available. 

Поскольку вы не инициализировать tm_isdst в коде, значение по умолчанию (0) используются, что делает mktime думает, что в период NO-DST. Чтобы исправить это в коде, просто добавьте

localTM.tm_isdst = -1 

Примечания - эта логика необходима как для некоторых моментов времени просто «стандартной дата» информация, хранящаяся в tm не является достаточной для определения точного времени.

И да, тот факт, что поведение по умолчанию, как это немного перепутались :)

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