Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разница в реализации mktime в vs2003 и vs2005, грабли со временем 
:(
    Опции темы
blackofe
Дата 15.3.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: нет
Всего: 4



имеется функция по приведению времени. написана в 2003 студии. пока с ней разбирался, решил проверить, как аналогичные функции работают в студии 2005 и обнаружил неприятную вещь.

код – один и тот же. есть некая начальная дата "2006-10-23T23:57:15". она приводится к гринвичу

Код

tm *pgreenwich_time_stru = gmtime(&theirtrandate);


а затем вызывается mktime(), чтобы получить time_t значение, с которым потом можно работать. ниже приводится содержимое структуры tm и возвращаемое значение time_t до и после вызова mktime в 2003 и 2005 студиях соответственно:

Код

2003 (Microsoft Visual C++ .NET   69586-335-0000007-18668):

-    pgreenwich_time_stru    0x0045b7a8 tb    tm *
    tm_sec        15    int
    tm_min    57    int
    tm_hour    3    int
    tm_mday    24    int
    tm_mon    9    int
    tm_year    106    int
    tm_wday    2    int
    tm_yday    296    int
    tm_isdst    0    int

time_t greenwichtime = mktime(pgreenwich_time_stru);

-    pgreenwich_time_stru    0x0045b7a8 tb    tm *
    tm_sec        15    int
    tm_min    57    int
    tm_hour    3    int
    tm_mday    24    int
    tm_mon    9    int
    tm_year    106    int
    tm_wday    2    int
    tm_yday    296    int
    tm_isdst    1    int

    greenwichtime    1161676635    long

2005 (Microsoft Visual Studio 2005 Version 8.0.50727.762  (SP.050727-7600)
Microsoft Visual C++ 2005   77642-113-3000004-41648):

-    greenwich_time_stru    {tm_sec=15 tm_min=57 tm_hour=3 ...}    tm
    tm_sec        15    int
    tm_min    57    int
    tm_hour    3    int
    tm_mday    24    int
    tm_mon    9    int
    tm_year    106    int
    tm_wday    2    int
    tm_yday    296    int
    tm_isdst    0    int

time_t greenwichtime = mktime(pgreenwich_time_stru);

-    greenwich_time_stru    {tm_sec=15 tm_min=57 tm_hour=4 ...}    tm
    tm_sec        15    int
    tm_min    57    int
    tm_hour    4    int
    tm_mday    24    int
    tm_mon    9    int
    tm_year    106    int
    tm_wday    2    int
    tm_yday    296    int
    tm_isdst    1    int

    greenwichtime    1161680235    __int64


mktime() как водится в процессе вызова пытается нормализовать структуру, но делает это она по-разному. в 2003-й студии она всего лишь выставляет ненулевым значение tm_isdst, что вполне логично – 24 (и 23) октября действует летнее время. но 2005-я студия не только меняет это значение, но еще и подкручивает час на единичку. в результате возвращаемые значения time_t различны: 1161676635 в 2003-й студии и 1161680235 – в 2005-й. разница – 3600, т.е. ровно час.

пробовал переписать код под 2005 с использованием gmtime_s() и подобных – результат аналогичный.

че за фигня? или я туплю?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.