2009-10-20 30 views
11
//parses some string into that format. 
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S") 

//gets the seconds from the above date. 
timestamp1 = time.mktime(datetime1.timetuple()) 

//adds milliseconds to the above seconds. 
timeInMillis = int(timestamp1) * 1000 

¿Cómo puedo (en cualquier punto de ese código) convertir la fecha en formato UTC? He estado trabajando en API durante lo que parece ser un siglo y no encuentro nada que pueda funcionar. ¿Alguien puede ayudar? Actualmente lo estoy convirtiendo en hora del este, creo (sin embargo, estoy en GMT pero quiero UTC).Convertir a UTC Timestamp

EDIT: Di la respuesta al hombre más cercano a lo que finalmente descubrí.

datetime1 = datetime.strptime(somestring, someformat) 
timeInSeconds = calendar.timegm(datetime1.utctimetuple()) 
timeInMillis = timeInSeconds * 1000 

:)

+0

¿Podría especificar qué zona horaria 'somestring' in? ¿Es UTC o la zona horaria local? 'timegm (datetime1.utctimetuple())' no funcionará si 'datetime1' ya no está en UTC. 'utctimetuple()' does * not * lo convierte a UTC a menos que se le dé un objeto datetime consciente. – jfs

Respuesta

2
def getDateAndTime(seconds=None): 
""" 
    Converts seconds since the Epoch to a time tuple expressing UTC. 
    When 'seconds' is not passed in, convert the current time instead. 
    :Parameters: 
     - `seconds`: time in seconds from the epoch. 
    :Return: 
     Time in UTC format. 
""" 
return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))` 

Esto convierte hora local a UTC

time.mktime(time.localtime(calendar.timegm(utc_time))) 

http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

Si la conversión de un struct_time a segundo-desde-la-época se realiza utilizando mktime, esta conversión es en la zona horaria local. No hay forma de decirle que use cualquier zona horaria específica, ni siquiera solo UTC. El paquete estándar de 'tiempo' siempre asume que un tiempo está en su zona horaria local.

+0

-1: 'getDateAndTime()' no está relacionado (acepta 'seconds' que la pregunta pregunta cómo llegar en primer lugar) y se rompe: la implementación no se corresponde con su docstring. Si tiene 'utc_time', entonces es suficiente llamar a' calendar.timegm() '(tanto localtime, mktime son innecesarios y pueden producir resultados incorrectos). – jfs

8

datetime.utcfromtimestamp es probablemente lo que usted está buscando:

>>> timestamp1 = time.mktime(datetime.now().timetuple()) 
>>> timestamp1 
1256049553.0 
>>> datetime.utcfromtimestamp(timestamp1) 
datetime.datetime(2009, 10, 20, 14, 39, 13) 
+4

Aplicable solo a pitón 3. –

+2

¿Por qué solo es aplicable a Python 3? Parece funcionar bien en 2.7. – sevko

3

Creo que se puede utilizar el método de utcoffset():

utc_time = datetime1 - datetime1.utcoffset() 

Los documentos dan una ejemplo de esto usando el método astimezone()here .

Además, si usted va a estar tratando con zonas horarias, es posible que desee ver en la PyTZ library que tiene un montón de herramientas útiles para la conversión de fecha y hora en varias zonas horarias (incluyendo entre EST y UTC)

Con PyTZ :

from datetime import datetime 
import pytz 

utc = pytz.utc 
eastern = pytz.timezone('US/Eastern') 

# Using datetime1 from the question 
datetime1 = datetime.strptime(somestring, "%Y-%m-%dT%H:%M:%S") 

# First, tell Python what timezone that string was in (you said Eastern) 
eastern_time = eastern.localize(datetime1) 

# Then convert it from Eastern to UTC 
utc_time = eastern_time.astimezone(utc) 
+0

+1 para la localización de pytz(). Nota: 'datetime1' en la pregunta es un objeto naive datetime, es decir,' datetime1.utcoffset() 'devuelve' None' (no puede obtener el tiempo UTC de esa manera). – jfs

1

Es posible que desee uno de estos dos:

import time 
import datetime 

from email.Utils import formatdate 

rightnow = time.time() 

utc = datetime.datetime.utcfromtimestamp(rightnow) 
print utc 

print formatdate(rightnow) 

Las dos salidas se ven así

2009-10-20 14:46:52.725000 
Tue, 20 Oct 2009 14:46:52 -0000 
Cuestiones relacionadas