Python时间到了,第二部分:时区

继上一个问题之后, Python的时间到了 ,我现在遇到了关于时区的问题,结果并不总是“+0200”。 所以当strptime试图parsing它时,就会抛出exception。

我想只是用[:-6]或者其他什么来砍掉+0200,但是有没有一种真正的方法可以用strptime来实现呢?

如果它很重要,我正在使用Python 2.5.2。

>>> from datetime import datetime >>> fmt = "%a, %d %b %Y %H:%M:%S +0200" >>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200", fmt) datetime.datetime(2008, 7, 22, 8, 17, 41) >>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0300", fmt) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/_strptime.py", line 330, in strptime (data_string, format)) ValueError: time data did not match format: data=Tue, 22 Jul 2008 08:17:41 +0300 fmt=%a, %d %b %Y %H:%M:%S +0200 

2.6版本中的新function

对于一个天真的对象,%z和%Z格式代码被replace为空string。

它看起来像只在> = 2.6中实现,我认为你必须手动parsing它。

我看不到另一个解决scheme,而不是删除时区数据:

 from datetime import timedelta,datetime try: offset = int("Tue, 22 Jul 2008 08:17:41 +0300"[-5:]) except: print "Error" delta = timedelta(hours = offset / 100) fmt = "%a, %d %b %Y %H:%M:%S" time = datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200"[:-6], fmt) time -= delta 

有没有一个真正的方法来做到这一点strptime?

不,但是由于您的格式似乎是RFC822系列date,您可以使用电子邮件库更容易地读取它:

 >>> import email.utils >>> email.utils.parsedate_tz('Tue, 22 Jul 2008 08:17:41 +0200') (2008, 7, 22, 8, 17, 41, 0, 1, 0, 7200) 

(7200 = UTC中的时区偏移,以秒为单位)

你可以使用这个非常有用的dateutil库:

 from datetime import datetime from dateutil.parser import parse dt = parse("Tue, 22 Jul 2008 08:17:41 +0200") ## datetime.datetime(2008, 7, 22, 8, 17, 41, tzinfo=tzoffset(None, 7200)) <- dt print dt 2008-07-22 08:17:41+02:00 

据我所知, strptime()不识别数字时区代码。 如果你知道这个string总是以这个forms的时区指定结束(+或者 – 后跟4个数字),那么把它关掉然后手动parsing看起来是一个非常合理的事情。

看起来,%Z对应于时区名称,而不是偏移量。

例如,给出:

 >>> format = '%a, %d %b %Y %H:%M:%S %Z' 

我可以parsing:

 >>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 GMT', format) datetime.datetime(2008, 7, 22, 8, 17, 41) 

虽然它似乎对时区没有做任何事情,只是看它存在而且是有效的:

 >>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 NZDT', format) datetime.datetime(2008, 7, 22, 8, 17, 41) 

我想如果你愿意的话,你可以find偏移量到名字的映射,转换你的input,然后parsing它。 不过,截断input可能会更简单。