2009-10-20 7 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 

Comment puis-je (à tout moment dans ce code) transformer la date au format UTC? J'ai parcouru l'API pour ce qui semble être un siècle et je ne trouve rien que je puisse travailler. Quelqu'un peut-il aider? Il est actuellement en train de le transformer en heure de l'Est je crois (mais je suis en GMT, mais je veux UTC).Convertir en horodatage UTC

EDIT: J'ai donné la réponse au gars avec le plus proche de ce que j'ai finalement découvert.

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

:)

+0

Pourriez-vous spécifier dans quel fuseau horaire 'somestring'? Est-ce UTC ou le fuseau horaire local? 'timegm (datetime1.utctimetuple())' ne fonctionnera pas si 'datetime1' n'est pas déjà en UTC. 'utctimetuple()' ne * * pas * le convertir en UTC à moins d'avoir reçu un objet datetime conscient. – jfs

Répondre

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))` 

Il convertit l'heure locale à UTC

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

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

Si la conversion d'un struct_time en secondes-depuis l'epoch se fait en utilisant mktime, cette conversion est dans le fuseau horaire local. Il n'y a aucun moyen de lui dire d'utiliser un fuseau horaire spécifique, pas même UTC. Le paquet 'time' standard suppose toujours qu'une heure est dans votre fuseau horaire local.

+0

-1: 'getDateAndTime()' n'est pas lié (il accepte 'seconds' que la question demande comment obtenir en premier lieu) et il est cassé: l'implémentation ne correspond pas à sa docstring. Si vous avez 'utc_time' alors il suffit d'appeler' calendar.timegm() '(les deux heure locale, mktime sont inutiles et peuvent produire un mauvais résultat). – jfs

8

datetime.utcfromtimestamp est probablement ce que vous cherchez:

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

Applicable uniquement à python 3. –

+2

Pourquoi est-ce seulement applicable à Python 3? Il semble fonctionner correctement dans 2.7. – sevko

3

Je pense que vous pouvez utiliser la méthode utcoffset():

utc_time = datetime1 - datetime1.utcoffset() 

Les documents donnent une exemple de ceci en utilisant la méthode astimezone()here .

De plus, si vous allez avoir affaire avec les fuseaux horaires, vous pouvez regarder dans le PyTZ library qui a beaucoup d'outils utiles pour convertir des années datetime dans divers fuseaux horaires (y compris entre EST et UTC)

Avec 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 pour localiser() de pytz. Remarque: 'datetime1' dans la question est un objet datetime naïf, c'est-à-dire' datetime1.utcoffset() 'renvoie' None' (vous ne pouvez pas obtenir l'heure UTC de cette façon). – jfs

1

Vous voulez sans doute l'un de ces deux:

import time 
import datetime 

from email.Utils import formatdate 

rightnow = time.time() 

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

print formatdate(rightnow) 

Les deux sorties se présentent comme suit

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