Согласно man mktime
(на Linux, выделено мое):
Значение, указанное в tm_isdst
поле сообщает mktime (), действительно ли
летнее время (DST) в
эффект за время, указанное в тм
структура: положительное значение означает DST
действует; ноль означает, что DST
не в силе; и отрицательное значение
означает, что mktime () должен (использовать
информация о часовых поясах и система
базы данных, чтобы) попытаться определить
действует ли DST на
указанное время .
Вы пробовали это?
(Это «попытка определить», потому что некоторые моменты в корне неоднозначны.)
Что-то, что вы могли бы попробовать в действительно неоднозначные времена, это посмотреть, исправляет ли mktime
ваш флаг dst или нет. Держу пари, что это непереносимо. Пример кода, переход установлен 31/10/2010, в 3 часа откатится до 2 часов в моем часовом поясе (Европа / Париж):
#include <time.h>
#include <stdio.h>
#include <string.h>
void printit(int hour, int isdst)
{
struct tm when;
memset(&when, 0, sizeof(when));
when.tm_sec = 0;
when.tm_min = 30;
when.tm_hour = hour;
when.tm_mday = 31;
when.tm_mon = 9;
when.tm_year = 110;
when.tm_isdst = isdst;
time_t secs = mktime(&when);
fprintf(stdout, "%2d %ld %d %s", isdst, secs, when.tm_isdst, asctime(&when));
}
int main(int argc, char **argv)
{
for (int i=1; i<4; i++) {
fprintf(stdout, "At %dam\n", i);
printit(i, 1);
printit(i, 0);
printit(i, -1);
}
}
Вывод:
At 1am
1 1288481400 1 Sun Oct 31 01:30:00 2010
0 1288485000 1 Sun Oct 31 02:30:00 2010
-1 1288481400 1 Sun Oct 31 01:30:00 2010
At 2am
1 1288485000 1 Sun Oct 31 02:30:00 2010
0 1288488600 0 Sun Oct 31 02:30:00 2010
-1 1288488600 0 Sun Oct 31 02:30:00 2010
At 3am
1 1288488600 0 Sun Oct 31 02:30:00 2010
0 1288492200 0 Sun Oct 31 03:30:00 2010
-1 1288492200 0 Sun Oct 31 03:30:00 2010
Как видите, когда время не однозначно, mktime
исправляет его, устанавливая правильное значение tm_isdst
и смещая время.
Когда оно равно неоднозначно, tm_isdst
не изменяется.