Re: _mktime64() и отмена зимнего времени
От: Roman Odaisky Украина  
Дата: 04.12.11 10:55
Оценка:
Здравствуйте, igyrus, Вы писали:

I>После отмены перехода на зимнее время функция _mktime64() стала неправильно расчитывать __time64_t для дат зимнего времени прошлых лет. Она считает так, как будто бы раньше тоже не было перехода зимнее/летнее.


Windows никогда не славилась корректной работой с часовыми поясами.

I>Похоже придётся хранить все даты перевода часов с 1970 по 2011 и самому корректировать результат. Хотя оставляю надежду на какой-нибудь дельный совет.


Все даты перевода хранятся в tz database и поддерживаются в актуальном состоянии, с недавнего времени под эгидой IANA: http://www.iana.org/time-zones. Нормальные libc задействуют эту БД, а в Windows, наверное, можно таскать ее с собой и брать данные из нее, минуя системные вызовы.

~/src :) cat mktime.c
#include <time.h>
#include <stdio.h>

int main()
{
    // "26 Jan 2011 03:00:00"
    struct tm t2011 = {
        .tm_sec   = 0,
        .tm_min   = 0,
        .tm_hour  = 3,
        .tm_mday  = 26,
        .tm_mon   = 0,
        .tm_year  = 111,
        .tm_wday  = 0,
        .tm_yday  = 0,
        .tm_isdst = -1
    };
    printf("%lu\n", (unsigned long)mktime(&t2011));

    struct tm t2012 = t2011;
    t2012.tm_year += 1;
    printf("%lu\n", (unsigned long)mktime(&t2012));

    return 0;
}
~/src :) gcc -std=c99 -o mktime mktime.c
~/src :) TZ=Europe/Moscow ./mktime
1296000000
1327532400
~/src :) TZ=Europe/UTC ./mktime
1296010800
1327546800
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.