2017-01-23 2 views
2

J'ai deux machines distinctes (développement local et serveur) accédant au même datetime à partir d'une base de données. Les objets DateTime ont la même valeur (y compris fuseau horaire) sur les deux machines:Comment forcer datetime.strftime de python à sortir en UTC?

Local

print ts 
> datetime.datetime(2017, 1, 13, 7, 18, 9, 209000, tzinfo=<UTC>) 

serveur

print ts 
> datetime.datetime(2017, 1, 13, 7, 18, 9, 209000, tzinfo=<UTC>) 

Cependant, la sortie de strftime est différent sur les deux machines :

Local

print ts.strftime('%s') 
> 1484320689 

serveur

print ts.strftime('%s') 
> 1484291889 

Qu'est-ce qui se passe ici? Comment puis-je obtenir à la fois le client et le serveur pour produire la même chaîne d'horodatage dans UTC?

+0

Pouvez-vous inclure la façon exacte dont vous créez 'dt' afin que nous puissions répliquer correctement? Parce que j'utiliserais conventionnellement 'import datetime as dt' ce qui signifie que' print dt' donne ''. De toute évidence, cela ne reproduit pas le problème (et il manque la base de données lue), mais je ne vois pas comment créer un cas de test exact. – roganjosh

+0

@roganjosh dt était juste le nom de la variable que j'obtiens de la base de données. Je l'ai renommé en 'ts' pour éviter la confusion avec une importation telle que 'import datetime.datetime as dt'. – Paul

+0

Vous pouvez créer un cas de test similaire comme suit: 'print datetime.utcnow(). Replace (tzinfo = pytz.utc) .strftime ('% s')' L'exécution sur les deux machines séparées génère une sortie différente value (plus de quelques secondes), même si 'datetime.utcnow()' est le même sur les deux machines – Paul

Répondre

0

Au cas où quelqu'un rencontrerait ce post, j'ai trouvé la solution.

Il s'avère que strftime essaie toujours de convertir en heure locale et il n'y a pas grand-chose que vous pouvez faire à ce sujet.

La solution était d'utiliser le calendrier:

return calendar.timegm(datetime.utcnow().timetuple()) 

Si vous avez besoin de vos millisecondes:

return calendar.timegm(self.timestamp.timetuple()) * 1000 + self.timestamp.microsecond/1000 

Ou similaire pour microsecondes.