crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Борьба с функцией mktime
AD
  опции профиля:
сообщение 22.7.2009, 12:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


стандартная функция mktime() переводит в значение типа time_t из структуры tm, НО перед этим она нормализует эту структуру? Есть ли какая-нибудь возможность избежать этой нормализации? Потому что в результате портится все время в этой структуре и в time_t записывается тоже некорректное время. Как с этим бороться?

Ну пусть структура tm заполнена так:
tm_sec = 55
tm_min = 55
tm_hour = 10
tm_mday = 22
tm_mon = 6
tm_year = 109 (отсчет почему-то с 1900 года)
tm_wday = 0
tm_yday = 0
tm_isdst = 0

После использования mktime так заполненной структуры, время увеличивается на час вперед, последние 3 параметра тоже меняются. Соответственно необходимо каким-то образом нормализовывать эту структуру так, чтобы mktime выдавало верный результат. А как это сделать? Последние 3 параметра в любом случае я знать не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 22.7.2009, 12:29
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Большая и любимая тема 8) здесь нужно вдумчиво читать описание функции: http://www.opengroup.org/onlinepubs/009695...ons/mktime.html

Цитата:
Цитата
The original values of the tm_wday and tm_yday components of the structure are ignored, and the original values of the other components are not restricted to the ranges described in <time.h>.


И важный момент с DST:
Цитата
A positive or 0 value for tm_isdst shall cause mktime() to presume initially that Daylight Savings Time, respectively, is or is not in effect for the specified time. A negative value for tm_isdst shall cause mktime() to attempt to determine whether Daylight Savings Time is in effect for the specified time.


То есть:
tm_isdst =  0 // DST нет
tm_isdst =  1 // DST есть
tm_isdst = -1 // определить есть ли DST для этого времени


Лично я нарывался на tm_isdst инициализированный нулём что вызывало косяк в час в определённое время года :)

Вообще функции группы gmtime/localtime/asktime лично я если и использую, то с осторожностью... ибо чревато.

Для штук сложнее (с timezone например) рекомендую Boost Time.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.7.2009, 12:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Andrew Selivanov @ 22.7.2009, 13:29) *
То есть:
Вообще функции группы gmtime/localtime/asktime лично я если и использую, то с осторожностью... ибо чревато.

Для штук сложнее (с timezone например) рекомендую Boost Time.
Да тут тоже уже решил а не переписать ли с помощью Qt-шных средств. Почему-то раньше не замечал, что у QDate есть setDate(/*parameters*/), QTime - setHMS(/*parameters*/). Ну попробую и так, и так! :) Еще раз огромное спасибо!

Сообщение отредактировал AD - 22.7.2009, 14:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.11.2018, 6:22