Мы знаем, что часовой пояс UTC+8 имеет некоторые изменения часов. Например, 00:00:00 1 января 1928 года часы были переведены назад на 0:05:52 часов до 31 декабря 1927 года, 23:54:08.
Кроме того, в 1940-1941 и 1986-1991 годах использовалось летнее время. Когда я тестирую функцию mktime
под linux с этими датами, у меня разные возвращаемые значения. Код выглядит следующим образом:
#include <stdio.h>
#include <string.h>
#include <time.h>
int main(int argc, char *argv[])
{
struct tm timeinfo;
memset(&timeinfo, 0, sizeof(timeinfo));
while(fscanf(stdin, "%d%d%d%d%d%d",
&timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday,
&timeinfo.tm_hour, &timeinfo.tm_min, &timeinfo.tm_sec) != EOF)
{
timeinfo.tm_year -= 1900;
timeinfo.tm_mon -= 1;
fprintf(stdout, "%lld\n", mktime(&timeinfo));
}
return 0;
}
Тестовый ввод и вывод, например, таков: один и тот же ввод «1940 6 2 23 59 59» и «1940 6 3 1 0 0» будет иметь разное возвращаемое значение в зависимости от вызывающей последовательности:
1940 6 2 23 59 59
-933494401
1940 6 3 1 0 0
-933490800
1940 6 3 1 0 0
-933494400
1940 6 2 23 59 59
-933498001
1940 6 2 23 59 59
-933494401
Тот же ввод 1940 6 3 1 0 0
Почему это? Почему возвращаемое значение mktime
отличается в зависимости от вызывающей последовательности?
Я прочитал некоторую версию исходного кода mktime
, но не нашел ни одной части кода, которая могла бы вызвать эту проблему.
Кто-нибудь может объяснить, почему это происходит? Большое спасибо.
Недавно добавленные случаи:
1927 12 31 23 54 8
-1325491552
1927 12 31 23 54 7
-1325491905
1927 12 31 23 54 8
-1325491904
1928 1 1 0 0 0
-1325491200
1927 12 31 23 54 8
-1325491552
while(fscanf(stdin, "%d%d%d%d%d%d", ...) == 6)
- person chux - Reinstate Monica   schedule 19.08.2014mktime(&timeinfo)
используйтеtimeinfo.tm_isdst = -1
(летнее время недоступно), чтобы избежать наследования предыдущего значения. Толькоtm_wday
иtm_yday
можно оставить неинициализированными. - person chux - Reinstate Monica   schedule 19.08.2014"%lld\n"
--›"%ld\n"
и проверьте Является лиtime_t
типомlong long int
? - person BLUEPIXY   schedule 19.08.2014fprintf(stdout, "%lld\n", (long long) mktime(&timeinfo));
, чтобы устранить потенциальныеprintf()
проблемы. - person chux - Reinstate Monica   schedule 19.08.2014