2010-07-23 22 views
5

Tengo objetos datetime en tiempo UTC y quiero convertirlos a marcas de tiempo UTC. El problema es que time.mktime hace ajustes para el tiempo local.¿Cómo creo una marca de tiempo de unix que no se ajuste para localtime?

Así que aquí es un poco de código:

import os 
import pytz 
import time 
import datetime 

epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1)) 
print time.mktime(epoch.timetuple()) 

os.environ['TZ'] = 'UTC+0' 
time.tzset() 
print time.mktime(epoch.timetuple()) 

aquí hay una salida:

Python 2.6.4 (r264:75706, Dec 25 2009, 08:52:16) 
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> import pytz 
>>> import time 
>>> import datetime 
>>> 
>>> epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1)) 
>>> print time.mktime(epoch.timetuple()) 
25200.0 
>>> 
>>> os.environ['TZ'] = 'UTC+0' 
>>> time.tzset() 
>>> print time.mktime(epoch.timetuple()) 
0.0 

Así que, obviamente, si el sistema está en hora UTC ningún problema, pero cuando no lo es, es un problema . Configurar la variable de entorno y llamar a time.tzset funciona, pero, ¿es seguro? No quiero ajustarlo para todo el sistema.

¿Hay alguna otra manera de hacerlo? ¿O es seguro llamar a time.tzset de esta manera?

Respuesta

6

El módulo contiene calendarcalendar.timegm que resuelve este problema.

calendar.timegm (tupla)

Una función no relacionada pero práctico que toma una tupla tiempo como devuelto por la función gmtime() en el módulo time, y devuelve el valor de marca de tiempo Unix correspondiente, suponiendo una época de 1970, y la Codificación POSIX. De hecho, time.gmtime() y timegm() son inversos.

Cuestiones relacionadas