Хорошо известно, что подписанный 32-разрядный time_t
закончится 19 января 2038 года (проблема Y2038 ).
Функция Windows _gmtime64
принимает 64-битную time_t
, поэтому в принципе она может поддерживать значительно больший диапазон дат. Но оказывается, что он не поддерживает даты после 3000 года. В частности, наибольшее значение time_t
, которое может быть успешно передано _gmtime64
, равно 32536846799, то есть 19 января 3001 года.
Это просто совпадение, что эти два, по-видимому, не связанных диапазона заканчиваются 19 января? Почему _gmtime64
заканчивается, когда это происходит?
Python-код для вычисления наибольшего допустимого time_t
:
In [1]: from time import gmtime
# invariant: gmtime(low) is ok, gmtime(high) fails
In [2]: low, high = 0, 100000000000
In [3]: while high - low > 1:
...: midpoint = low + (high - low) // 2
...: try:
...: gmtime(midpoint)
...: except OSError:
...: high = midpoint
...: else:
...: low = midpoint
...:
In [4]: low
Out[4]: 32536846799