2009-05-08 10 views
5

El Python oficial 2.5 en Windows se compiló con Visual Studio.Net 2003, que usa 32 bit time_t. Entonces cuando el año es> 2038, solo da excepciones.Cómo usar el tiempo> año 2038 en Windows oficial Python 2.5

Aunque esto está arreglado en Python 2.6 (que cambió time_t a 64 bit con VS2008), me gustaría usar 2.5 porque muchos módulos ya están compilados para él.

Así que aquí está mi pregunta: ¿hay alguna solución para dejar que mi programa maneje fácilmente el año> 2038 y seguir usando el Python 2.5 oficial? Por ejemplo, algunas bibliotecas prefabricadas como "time64" o "longtime", etc ...

Por favor, no me digan que actualizo a 2.6+ u olvide el error - Tengo una razón para necesitar hacerlo funcionar, es por eso Publiqué la pregunta aquí.

+0

2038 está muy lejos ... no se preocupe.

+4

personas solían considerar 2000 un largo camino en los años 80/90, es por eso que tenemos el error Y2K ... – Francis

+1

Almacenar la fecha como una cadena como: "20080122". Optimizarlo eliminando ceros redundantes. Entonces eso se convierte en: "8-12-2".Sabes que es el año 2000, entonces 2 no es necesario. Después de que la almacenan en un archivo XML para facilitar el acceso como: jue Si utiliza este a través de su aplicación, entonces usted no tendrá ningún problema y sin necesidad para el tipo de fecha incorporado. – drozzy

Respuesta

3

La mejor solución que he encontrado es obtener una copia fuente de Python 2.5 y volver a compilar el módulo de tiempo con compiladores que predeterminan time_t a 64 bits, por ejemplo VS2005 o VS2008 (también pueden configurar el tiempo de ejecución C para prevenir el problema lado a lado).

5

El módulo datetime en la biblioteca estándar debería funcionar bien para usted. ¿Qué necesita del módulo time que datetime no ofrece?

+0

¿alguna vez has intentado datetime? datetime no se basa en time_t, y tampoco admite time_t64 (pruebe datetime.datetime.fromtimestamp (LARGE_NUMBER_HERE)) – Francis

+0

@Francis: también uso datetime. No basado en time_t no tiene mucho impacto. ¿Qué hay de malo con usar datetime? ¿Algún error o problema específico? –

+2

Sí. datetime no ayuda - si necesito obtener un time_t como time.time(), pasar Y2039 a datetime fallará con el mensaje "ValueError: timestamp fuera del rango de la plataforma time_t". Si cambia el reloj del sistema al año 2039, la invocación datetime.date.today() también falla como "ValueError: timestamp fuera del rango para la función localtime() de la plataforma". Por lo tanto, datetime no cambia nada, es simplemente un módulo de tiempo predeterminado. – Francis

5

no me refiero a sonar trillado, pero por qué no:

  • olvidarse de la Y2038 error con Python 2.5
  • actualización a Python 2.6 en algún momento en el futuro antes de 2038

edición: para aclarar: (y lo digo en serio — no me refiero a burlarse)

Es de suponer que puede actualizar Python a 2.6 (o posterior) en algún momento indefinido entre ahora y 2038. Tal vez en 2012. Quizás en 2015. Tal vez en 2037.

Si conoce las diferencias entre la variable de marca de tiempo de Python en su aplicación (no soy mucho de un usuario de Python), parece que estos serían los aspectos importantes a considerar:

  • lo que se están guardando datos persistentemente
  • cómo una variable 2.5 Python marca de tiempo que ha sido persistió, se restaura usando Python 2.6 (presumiblemente "hará lo correcto")
  • si los datos antiguos se almacenarán en su forma persistente el tiempo suficiente para que surjan ambigüedades (p. el año "96" no es ambigua cuando se consideran entre 1950 y 2049, pero si que los datos se mantienen en torno hasta el año 2230 y luego "96" podría ser 1996, 2096 o 2196)

Si las respuestas son favorables, solo usa la marca de tiempo regular con su error 2038. Tendrás que compararlo con la cantidad de rediseño/refactorización que tendrías que hacer para que tu aplicación funcione con una marca de tiempo alternativa (por ejemplo, una cadena de fecha y hora de la base de datos o lo que sea).

+0

ooh eso es bueno. (15 char limit dot!) – drozzy

+0

python 2.6 está usando vc8 lado a lado en tiempo de ejecución, por lo que no quiero cambiarlo ahora (muchos módulos fallarían). – Francis

+0

+1: Ponga una nota en su calendario de Outlook para julio de 2037 para hacer la actualización. –

Cuestiones relacionadas