Как использовать время> 2038 года на официальном Windows Python 2.5 - PullRequest
5 голосов
/ 08 мая 2009

Официальный Python 2.5 для Windows был собран с Visual Studio.Net 2003, который использует 32-битный time_t. Поэтому, когда год> 2038, он просто дает исключения.

Хотя это исправлено в Python 2.6 (который с VS2008 изменил time_t на 64 бит), я бы хотел использовать 2.5, потому что многие модули уже скомпилированы для него.

Итак, вот мой вопрос - есть ли решение, позволяющее моей программе легко обрабатывать год> 2038 и все еще использовать официальный Python 2.5? Например, некоторые готовые библиотеки, такие как "time64" или "longtime" и т. Д ...

Пожалуйста, не говорите мне, чтобы я обновлялся до версии 2.6+ и не забывал об ошибке - у меня есть причина, почему я должен заставить ее работать, поэтому я выкладываю вопрос здесь.

Ответы [ 3 ]

6 голосов
/ 08 мая 2009

Модуль datetime в стандартной библиотеке должен нормально работать. Что вам нужно от модуля time, который datetime не предлагает?

5 голосов
/ 08 мая 2009

Я не хочу звучать банально, но почему бы и нет:

  • забудьте об ошибке Y2038 с Python 2.5
  • обновление до Python 2.6 в какой-то момент в будущем до 2038

редактирование: Чтобы уточнить: (и я серьезно - я не хотел подшучивать)

Предположительно, вы можете обновить Python до версии 2.6 (или более поздней) через некоторое неопределенное время с настоящего момента до 2038 года. Возможно, в 2012 году. Может быть, в 2015 году. Может быть, в 2037 году.

Если вам известно о различиях между временной меткой Python в вашем приложении (я не большой пользователь Python), похоже, что это важные аспекты, которые следует учитывать:

  • какие данные сохраняются постоянно
  • как переменная временной метки Python 2.5, которая была сохранена, восстанавливается с помощью Python 2.6 (предположительно, она будет «делать правильные вещи»)
  • будут ли старые данные храниться в постоянной форме достаточно долго, чтобы возникли неоднозначности (например, год "96" является недвусмысленным, если рассматривать его между 1950 и 2049 годами, но если эти данные хранятся до 2230 года, то "96" может быть 1996, 2096 или 2196)

Если ответы положительные, просто используйте обычную метку времени с ошибкой 2038. Вам нужно будет сравнить это с количеством редизайна / рефакторинга, которое вам нужно сделать, чтобы ваше приложение работало с альтернативной временной меткой (например, строкой временной метки базы данных или чем-то еще).

3 голосов
/ 08 декабря 2009

Лучшее решение, которое я нашел, - это получить исходную копию Python 2.5 и повторно скомпилировать модуль времени с компиляторами, которые по умолчанию используют time_t до 64 бит, например VS2005 или VS2008 (может также настроить среду выполнения C для предотвращения параллельная проблема).

...