2010-07-20 4 views
7

J'essaie de convertir un horodatage de chaîne en un objet datetime approprié. Le problème que j'ai est qu'il y a un décalage de fuseau horaire et tout ce que je fais ne semble pas fonctionner. En fin de compte, je veux convertir l'horodatage de la chaîne en un objet datetime dans le fuseau horaire de mon ordinateur.Convertit l'horodatage de chaîne (avec décalage de fuseau horaire) en heure locale. . ? python

# string timestamp  
date = u"Fri, 16 Jul 2010 07:08:23 -0700" 
+1

Pouvez-vous poster ce que vous avez jusqu'à présent pour le code? – bstpierre

Répondre

8

Le paquet dateutil est à portée de main pour la date/fois l'analyse syntaxique:

In [10]: date = u"Fri, 16 Jul 2010 07:08:23 -0700" 

In [11]: from dateutil.parser import parse 

In [12]: parse(date) 
Out[12]: datetime.datetime(2010, 7, 16, 7, 8, 23, tzinfo=tzoffset(None, -25200)) 

Enfin, pour convertir dans votre fuseau horaire local,

In [13]: parse(date).astimezone(YOUR_LOCAL_TIMEZONE) 
+0

Comment puis-je prendre ceci et le transformer en une représentation temporelle correspondant à mon fuseau horaire actuel? et merci pour cela :) – alfredo

+0

Content de vous aider. Vous pouvez utiliser la méthode 'astimezone' de l'objet datetime retourné par parse. Voir cette question pour plus de détails: http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – ars

+0

Dateutil roches! analysé ma chaîne ("2013-10-22T21: 56: 00.000-03: 00") sans que je doive fournir une chaîne de format. – fccoelho

4

Il ressemble à datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z') devrait fonctionner, mais selon à this bug report il y a des problèmes avec le traitement %z. Donc, vous aurez probablement à gérer le fuseau horaire sur votre propre:

import datetime 

d = u"Fri, 16 Jul 2010 07:08:23 -0700" 

d, tz_info = d[:-5], d[-5:] 
neg, hours, minutes = tz_info[0], int(tz_info[1:3]), int(tz_info[3:]) 
if neg == '-': 
    hours, minutes = hours * -1, minutes * -1 

d = datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S ') 
print d 
print d + datetime.timedelta(hours = hours, minutes = minutes) 
0

est ici une solution stdlib:

>>> from datetime import datetime 
>>> from email.utils import mktime_tz, parsedate_tz 
>>> datetime.fromtimestamp(mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700"))) 
datetime.datetime(2010, 7, 16, 16, 8, 23) # your local time may be different 

Voir aussi, Python: parsing date with timezone from an email.

Note: fromtimestamp() peut échouer si le fuseau horaire local avait différent décalage horaire UTC dans le passé (2010) et si elle n'utilise pas une base de données de fuseau horaire historique sur la plate-forme donnée. Pour résoudre ce problème, vous pouvez utiliser tzlocal.get_localzone() pour obtenir un objet tzinfo pytz représentant votre fuseau horaire local. pytz fournit un accès à la base de données tz d'une manière portable:

>>> timestamp = mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700")) 
>>> import tzlocal # $ pip install tzlocal 
>>> str(datetime.fromtimestamp(timestamp, tzlocal.get_localzone())) 
'2010-07-16 16:08:23+02:00' 
Questions connexes