Здравствуйте, 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