How do I parse an ISO 8601-formatted date?

后端 未结 27 2306
小鲜肉
小鲜肉 2020-11-21 06:08

I need to parse RFC 3339 strings like \"2008-09-03T20:56:35.450686Z\" into Python\'s datetime type.

I have found strptime in the Python sta

相关标签:
27条回答
  • 2020-11-21 06:24

    A simple option from one of the comments: replace 'Z' with '+00:00' - and use Python3.7+'s fromisoformat.

    from datetime import datetime
    
    s = "2008-09-03T20:56:35.450686Z"
    
    datetime.fromisoformat(s.replace('Z', '+00:00'))
    # datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=datetime.timezone.utc)
    

    Although strptime can parse the 'Z' character, fromisoformat is faster by ~ x40 (see also: A faster strptime):

    %timeit datetime.fromisoformat(s.replace('Z', '+00:00'))
    387 ns ± 20.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%f%z')
    15.3 µs ± 540 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    0 讨论(0)
  • 2020-11-21 06:25

    I've coded up a parser for the ISO 8601 standard and put it on GitHub: https://github.com/boxed/iso8601. This implementation supports everything in the specification except for durations, intervals, periodic intervals, and dates outside the supported date range of Python's datetime module.

    Tests are included! :P

    0 讨论(0)
  • 2020-11-21 06:28

    If you are working with Django, it provides the dateparse module that accepts a bunch of formats similar to ISO format, including the time zone.

    If you are not using Django and you don't want to use one of the other libraries mentioned here, you could probably adapt the Django source code for dateparse to your project.

    0 讨论(0)
  • 2020-11-21 06:28

    This works for stdlib on Python 3.2 onwards (assuming all the timestamps are UTC):

    from datetime import datetime, timezone, timedelta
    datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%fZ").replace(
        tzinfo=timezone(timedelta(0)))
    

    For example,

    >>> datetime.utcnow().replace(tzinfo=timezone(timedelta(0)))
    ... datetime.datetime(2015, 3, 11, 6, 2, 47, 879129, tzinfo=datetime.timezone.utc)
    
    0 讨论(0)
  • 2020-11-21 06:29

    If you don't want to use dateutil, you can try this function:

    def from_utc(utcTime,fmt="%Y-%m-%dT%H:%M:%S.%fZ"):
        """
        Convert UTC time string to time.struct_time
        """
        # change datetime.datetime to time, return time.struct_time type
        return datetime.datetime.strptime(utcTime, fmt)
    

    Test:

    from_utc("2007-03-04T21:08:12.123Z")
    

    Result:

    datetime.datetime(2007, 3, 4, 21, 8, 12, 123000)
    
    0 讨论(0)
  • 2020-11-21 06:29

    Nowadays there's Maya: Datetimes for Humans™, from the author of the popular Requests: HTTP for Humans™ package:

    >>> import maya
    >>> str = '2008-09-03T20:56:35.450686Z'
    >>> maya.MayaDT.from_rfc3339(str).datetime()
    datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=<UTC>)
    
    0 讨论(0)
提交回复
热议问题