【问题标题】:Python time zone parsingPython时区解析
【发布时间】:2013-09-15 17:25:43
【问题描述】:

我在 python 中解析日期时遇到了一点问题

这是我必须解析的日期:

Sun Sep 15, 2013 12:10pm EDT

这就是我用来解析它的代码:

datetime.strptime( date, "%a %b %d, %Y %I:%M%p %Z")

一切都很好,但时区解析总是返回 ValueError 异常。我也尝试过 pytz 但没有任何成功。

那么如何使用 python 解析这种日期呢?

【问题讨论】:

    标签: python date date-parsing


    【解决方案1】:

    使用dateutil

    import dateutil.parser
    import pytz
    
    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
    
    date = 'Sun Sep 15, 2013 12:10pm EDT'
    dateutil.parser.parse(date, tzinfos=tzd) # => datetime.datetime(2013, 9, 15, 12, 10, tzinfo=tzoffset(u'EDT', -14400))
    

    tzd生成代码来自this answer

    更新

    注意 正如 Matt Johnson 所说,时区缩写列表并不准确。见his answer

    【讨论】:

    • 这不是一个好的建议。谁说这个时区缩写列表是准确的?时区缩写是模棱两可和矛盾的。例如,“CST”有 5 个截然不同的含义。有关详细信息,请参阅this list
    • @MattJohnson,感谢您的评论。我根据您的评论添加了一条注释。
    • 如果您的应用程序仅限于具有一组不同时区缩写的区域(例如,北美),这仍然是一个可接受的解决方案:timeanddate.com/library/abbreviations/timezones/na
    【解决方案2】:

    你不能。反正不靠谱。时区缩写是模棱两可和矛盾的。没有标准。

    例如,“CST”有 5 个截然不同的含义。

    • (UTC-06:00) 中部标准时间(美国)
    • (UTC-05:00) 古巴标准时间
    • (UTC+08:00) 中国标准时间
    • (UTC+09:30) 中部标准时间(澳大利亚)
    • (UTC+10:30) 中部夏令时间(澳大利亚)

    有关其他示例,请参阅 this list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-25
      • 2020-02-20
      • 1970-01-01
      • 2011-09-28
      • 2016-06-08
      • 2012-04-28
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多