在Python中解析带有timezone缩写名称的日期/时间字符串?

gct*_*gct 30 python timezone date

我正在尝试解析像"Sat, 11/01/09 8:00PM EST"Python中的时间戳字符串,但我找不到能够处理缩写时区的解决方案.

我正在使用dateutilparse()功能,但它不解析时区.是否有捷径可寻?

Nas*_*nov 60

dateutilparser.parse()接受作为关键字参数tzinfos的类型的字典{'EST': -5*3600}(即,匹配的区域名称为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
Run Code Online (Sandbox Code Playgroud)

关于内容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
Run Code Online (Sandbox Code Playgroud)

PS.@Hank Gay时区命名没有明确定义.为了形成我的表格,我使用了http://www.timeanddate.com/library/abbreviations/timezones/http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations.我查看了每个冲突,并解决了流行的(更常用的)晦涩和流行名称之间的冲突.有一个 - IST - 不是那么明确(它可能意味着印度标准时间,伊朗标准时间,爱尔兰标准时间以色列标准时间),所以我把它排除在表外 - 你可能需要选择添加什么根据您的位置.哦 - 我和他们荒谬的"看着我,我是第一个庆祝新年"GMT + 13和GMT + 14时区,遗漏了基里巴斯共和国.

  • 实用,简洁,整洁! (3认同)
  • 我无法让 [ChST](http://en.wikipedia.org/wiki/Chamorro_Time_Zone) 工作。小写 **h** 似乎会引起问题。我必须在时区列表中使用大写 CHST 并执行 `dp.parse(dt, tzinfos=tzd)` (2认同)

Han*_*Gay 12

这可能不会起作用,因为这些缩写并不是唯一的.有关详情,请参阅此页面.如果您正在处理一组已知的输入,您可能需要自己手动处理它.

  • 到目前为止,最简单的路线(尽管通常不是最实用的)是调整提供数据的任何程序,因此它以UTC格式发送所有数据,或者使用UTC的偏移量失败,或者从zoneinfo失去完整有效的时区数据库. (4认同)

Dra*_*uan 10

您可以尝试使用pytz模块:http://pytz.sourceforge.net/

pytz将Olson tz数据库带入Python.该库允许使用Python 2.3或更高版本进行准确的跨平台时区计算.它还解决了夏令时结束时模糊时间的问题,您可以在Python库参考(datetime.tzinfo)中阅读更多相关内容.

几乎所有的奥尔森时区都得到了支持.

  • 我很好奇,怎么解析"星期六,11月1日下午9点,美国东部时间晚上8点"与所说的金字塔? (2认同)
  • @NasBanov:'EST'含糊不清,但[你可以用pytz来列举所有可能的解释](http://stackoverflow.com/a/13713813/4279). (2认同)

Mik*_*one 5

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

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