Python time to age, part 2: timezones
本问题已经有最佳答案,请猛点这里访问。
继我之前的问题,Python时间到了老化,我现在遇到了关于时区的问题,结果发现它并不总是"+0200"。 因此当strptime尝试解析它时,它会引发异常。
我想过用[:-6]或者其他什么来切断+0200,但有一种真正的方法可以用strptime做到这一点吗?
如果重要的话,我正在使用Python 2.5.2。
1 2 3 4 5 6 7 8 9 10 | >>> 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 |
is there a real way to do this with strptime?
不,但由于您的格式似乎是RFC822系列日期,因此您可以使用电子邮件库更轻松地阅读它:
1 2 3 | >>> 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的时区偏移,以秒为单位)
New in version 2.6.
For a naive object, the %z and %Z
format codes are replaced by empty
strings.
它看起来只在> = 2.6中实现,我认为你必须手动解析它。
除了删除时区数据,我看不到另一种解决方案:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
您可以使用非常有用的
1 2 3 4 5 6 7 8 | 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 |
据我所知,
似乎%Z对应于时区名称,而不是偏移。
例如,给定:
1 | >>> format = '%a, %d %b %Y %H:%M:%S %Z' |
我可以解析:
1 2 | >>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 GMT', format) datetime.datetime(2008, 7, 22, 8, 17, 41) |
虽然它似乎对时区没有任何作用,但只是观察它存在且有效:
1 2 | >>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 NZDT', format) datetime.datetime(2008, 7, 22, 8, 17, 41) |
我想如果你愿意,你可以找到偏移到名称的映射,转换你的输入,然后解析它。但是,截断输入可能更简单。