用Python中的时区缩写名称parsingdate/时间string?

我试图用Pythonparsing时间戳string,例如"Sat, 11/01/09 8:00PM EST" ,但是我很难find解决scheme来处理缩短的时区。

我正在使用dateutilparse()函数,但它不parsing时区。 有没有一个简单的方法来做到这一点?

这可能不会工作,因为这些缩写不是唯一的。 详情请参阅此页面 。 如果您正在使用已知的一组input,则可能只需手动处理即可。

dateutilparser.parse()接受types为{'EST': -5*3600}的字典作为关键字参数tzinfos (即将区域名称与GMT偏移量相匹配)。 所以假设我们有这个,我们可以这样做:

 >>> import dateutil.parser as dp >>> s = 'Sat, 11/01/09 8:00PM' >>> for tz_code in ('PST','PDT','MST','MDT','CST','CDT','EST','EDT'): >>> dt = s+' '+tz_code >>> print dt, '=', dp.parse(dt, tzinfos=tzd) Sat, 11/01/09 8:00PM PST = 2009-11-01 20:00:00-08:00 Sat, 11/01/09 8:00PM PDT = 2009-11-01 20:00:00-07:00 Sat, 11/01/09 8:00PM MST = 2009-11-01 20:00:00-07:00 Sat, 11/01/09 8:00PM MDT = 2009-11-01 20:00:00-06:00 Sat, 11/01/09 8:00PM CST = 2009-11-01 20:00:00-06:00 Sat, 11/01/09 8:00PM CDT = 2009-11-01 20:00:00-05:00 Sat, 11/01/09 8:00PM EST = 2009-11-01 20:00:00-05:00 Sat, 11/01/09 8:00PM EDT = 2009-11-01 20:00:00-04:00 

关于tzinfos的内容,这里是我如何填充我的:

 tz_str = '''-12 Y -11 X NUT SST -10 W CKT HAST HST TAHT TKT -9 V AKST GAMT GIT HADT HNY -8 U AKDT CIST HAY HNP PST PT -7 T HAP HNR MST PDT -6 S CST EAST GALT HAR HNC MDT -5 R CDT COT EASST ECT EST ET HAC HNE PET -4 Q AST BOT CLT COST EDT FKT GYT HAE HNA PYT -3 P ADT ART BRT CLST FKST GFT HAA PMST PYST SRT UYT WGT -2 O BRST FNT PMDT UYST WGST -1 N AZOT CVT EGT 0 Z EGST GMT UTC WET WT 1 A CET DFT WAT WEDT WEST 2 B CAT CEDT CEST EET SAST WAST 3 C EAT EEDT EEST IDT MSK 4 D AMT AZT GET GST KUYT MSD MUT RET SAMT SCT 5 E AMST AQTT AZST HMT MAWT MVT PKT TFT TJT TMT UZT YEKT 6 F ALMT BIOT BTT IOT KGT NOVT OMST YEKST 7 G CXT DAVT HOVT ICT KRAT NOVST OMSST THA WIB 8 H ACT AWST BDT BNT CAST HKT IRKT KRAST MYT PHT SGT ULAT WITA WST 9 I AWDT IRKST JST KST PWT TLT WDT WIT YAKT 10 K AEST ChST PGT VLAT YAKST YAPT 11 L AEDT LHDT MAGT NCT PONT SBT VLAST VUT 12 M ANAST ANAT FJT GILT MAGST MHT NZST PETST PETT TVT WFT 13 FJST NZDT 11.5 NFT 10.5 ACDT LHST 9.5 ACST 6.5 CCT MMT 5.75 NPT 5.5 SLT 4.5 AFT IRDT 3.5 IRST -2.5 HAT NDT -3.5 HNT NST NT -4.5 HLV VET -9.5 MART MIT''' tzd = {} for tz_descr in map(str.split, tz_str.split('\n')): tz_offset = int(float(tz_descr[0]) * 3600) for tz_code in tz_descr[1:]: tzd[tz_code] = tz_offset 

PS。 每@Hank盖伊时区的命名没有明确的定义。 为了组成我的表格,我使用了http://www.timeanddate.com/library/abbreviations/timezones/和http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations 。 我审视了每一场冲突,并解决了晦涩和受欢迎的名字之间的冲突stream行(更常用的名称)。 有一个 – IST – 这不是那么明确的(这可能意味着印度标准时间伊朗标准时间爱尔兰标准时间以色列标准时间 ),所以我把它从表格中删除了 – 您可能需要select要添加的内容为它根据您的位置。 噢 – 我以他荒谬的“看我,我是第一个庆祝新年”GMT + 13和GMT + 14时区,离开了基里巴斯共和国。

你可以试试pytz模块: http ://pytz.sourceforge.net/

Pytz将Olson tz数据库引入Python。 该库允许使用Python 2.3或更高版本进行精确的跨平台时区计算。 它还解决了夏令时结束时模糊不清的问题,您可以在Python Library Reference(datetime.tzinfo)中阅读更多内容。

所有的奥尔森时区都支持。

dateutil中的parse()函数无法处理时区。 我一直在使用的是%Z格式化程序和time.strptime()函数。 我不知道它是如何处理时区模糊的,但它似乎告诉我所需要的CDT和CST之间的区别。

背景:我使用当地时间将备份图像存储在名称为时间戳的目录中,因为我家里没有GMT时钟。 因此,我使用time.strptime(d,r“%Y-%m-%dT%H:%M:%S_%Z”)将目录名称parsing回实际时间进行年龄分析。

我用pytz生成一个TZINFOS映射:

 from datetime import datetime as dt import pytz from dateutil.tz import gettz from pytz import utc from dateutil import parser def gen_tzinfos(): for zone in pytz.common_timezones: try: tzdate = pytz.timezone(zone).localize(dt.utcnow(), is_dst=None) except pytz.NonExistentTimeError: pass else: tzinfo = gettz(zone) if tzinfo: yield tzdate.tzname(), tzinfo 

TZINFOS用法

 >>> TZINFOS = dict(gen_tzinfos()) >>> TZINFOS {'+02': tzfile('/usr/share/zoneinfo/Antarctica/Troll'), '+03': tzfile('/usr/share/zoneinfo/Europe/Volgograd'), '+04': tzfile('Europe/Ulyanovsk'), '+05': tzfile('/usr/share/zoneinfo/Indian/Kerguelen'), ... 'WGST': tzfile('/usr/share/zoneinfo/America/Godthab'), 'WIB': tzfile('/usr/share/zoneinfo/Asia/Pontianak'), 'WIT': tzfile('/usr/share/zoneinfo/Asia/Jayapura'), 'WITA': tzfile('/usr/share/zoneinfo/Asia/Makassar'), 'WSDT': tzfile('/usr/share/zoneinfo/Pacific/Apia'), 'XJT': tzfile('/usr/share/zoneinfo/Asia/Urumqi')} 

parser用法

 >>> date_str = 'Sat, 11/01/09 8:00PM EST' >>> tzdate = parser.parse(date_str, tzinfos=TZINFOS) >>> tzdate.astimezone(utc) datetime.datetime(2009, 11, 2, 1, 0, tzinfo=<UTC>) 

UTC转换是必需的,因为每个缩写都有许多时区可用。 由于TZINFOS是一个dict ,它只有每个缩写的最后一个时区。 而且,您可能无法获得预期转换的预期结果。

 >>> tzdate datetime.datetime(2009, 11, 1, 20, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/Port-au-Prince'))