如何将ISO 8601日期时间字符串转换为Python日期时间对象?

这个问题在这里已经有了答案:

  • 如何解析ISO 8601格式的日期? 23个答案

  • 我更喜欢使用dateutil库进行时区处理,并且通常使用固定日期解析。 如果你想得到一个ISO 8601字符串,例如:2010-05-08T23:41:54.000Z你可以用strptime解析这个有趣的时间,特别是如果你不知道时区是否包含在内。 pyiso8601有几个问题(检查他们的跟踪器),我在使用过程中碰到过,并且在几年内还没有更新。 相比之下,dateutil一直活跃并为我工作:

    import dateutil.parser
    yourdate = dateutil.parser.parse(datestring)
    

    使用Python 2.5:

    datetime.datetime.strptime( "2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S" )
    

    由于ISO 8601允许存在许多可选冒号和破折号的变体,基本上CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] 。 如果你想使用strptime,你需要首先去掉这些变体。

    目标是生成一个utc日期时间对象。


    如果您只想要一个适用于UTC的基本案例,并带有2016-06-29T19:36:29.3453Z的Z后缀:

    datetime.datetime.strptime(timestamp.translate(None, ':-'), "%Y%m%dT%H%M%S.%fZ")
    


    如果您想要处理时区偏移,例如2016-06-29T19:36:29.3453-04002008-09-03T20:56:35.450686+05:00使用以下内容。 这些将把所有的变体转换成没有可变分隔符的东西,比如20080903T205635.450686+0500使它更加一致/更容易解析。

    import re
    # this regex removes all colons and all 
    # dashes EXCEPT for the dash indicating + or - utc offset for the timezone
    conformed_timestamp = re.sub(r"[:]|([-](?!((d{2}[:]d{2})|(d{4}))$))", '', timestamp)
    datetime.datetime.strptime(conformed_timestamp, "%Y%m%dT%H%M%S.%f%z" )
    


    如果你的系统不支持%z strptime指令(你会发现类似于ValueError: 'z' is a bad directive in format '%Y%m%dT%H%M%S.%f%z' ),那么你需要手动偏移Z (UTC)的时间。 注意%z可能无法在python版本<3的系统上工作,因为它依赖于系统/ python构建类型(即Jython,Cython等)不同的c库支持。

    import re
    import datetime
    
    # this regex removes all colons and all 
    # dashes EXCEPT for the dash indicating + or - utc offset for the timezone
    conformed_timestamp = re.sub(r"[:]|([-](?!((d{2}[:]d{2})|(d{4}))$))", '', timestamp)
    
    # split on the offset to remove it. use a capture group to keep the delimiter
    split_timestamp = re.split(r"[+|-]",conformed_timestamp)
    main_timestamp = split_timestamp[0]
    if len(split_timestamp) == 3:
        sign = split_timestamp[1]
        offset = split_timestamp[2]
    else:
        sign = None
        offset = None
    
    # generate the datetime object without the offset at UTC time
    output_datetime = datetime.datetime.strptime(main_timestamp +"Z", "%Y%m%dT%H%M%S.%fZ" )
    if offset:
        # create timedelta based on offset
        offset_delta = datetime.timedelta(hours=int(sign+offset[:-2]), minutes=int(sign+offset[-2:]))
        # offset datetime with timedelta
        output_datetime = output_datetime + offset_delta
    
    链接地址: http://www.djcxy.com/p/35107.html

    上一篇: How do I translate a ISO 8601 datetime string into a Python datetime object?

    下一篇: How to print date in a regular format in Python?