Хорошо, я немного покопался в исходном коде Python. Проблема заключается в функции _PyTime_localtime
. Это вызывает функцию localtime_s , которая принимает 2 аргумента time_t t
и struct tm *tm
. Где t
- это time_t
объект для преобразования и tm
результирующая временная структура. Когда вы передаете 0 как time_t
, что совершенно правильно, результирующая структура имеет поле tm_hour
, установленное в 1 на моем компьютере. Также есть другой код для не-Windows вариантов, который вместо этого вызывает localtime_r .
Теперь проблема перемещается во внутреннюю функцию utc_to_seconds
, которая принимает временную структуру (разбитую на аргументы, например: int year, int month, int day, int hour, int minute, int second
). Теперь для года, месяца и дня проблем нет, он преобразуется в порядковый номер (который, кстати, является правильным порядковым числом). Но тогда функция имеет следующую последнюю строку:
return ((ordinal * 24 + hour) * 60 + minute) * 60 + second;
Где EPOCH должен вернуть туда 62135683200, но из-за этого дополнительного часа мы получаем 62135686800.
Все это объединяется во внутренней функции local_to_seconds
long long t, a, b, u1, u2, t1, t2, lt;
t = utc_to_seconds(year, month, day, hour, minute, second);
/* Our goal is to solve t = local(u) for u. */
lt = local(t);
if (lt == -1)
return -1;
a = lt - t;
u1 = t - a;
t1 = local(u1);
Где t = 62135683200
и lt = 62135686800
. В итоге мы получим u1 = -3600
, что приведет к неверному параметру.
Итак, сделайте вывод: проблема в том, когда вы звоните timestamp
. Я не совсем уверен, каким будет решение, чтобы исправить это в C-коде, но это определенно похоже на ошибку, я думаю.