13

I just created a data type for my date data, which returns a datetime.datetime object

Here is the code:

import datetime


class Date:
    def __new__(cls, dateTime, *args, **kwargs):
        return datetime.datetime.strptime(dateTime, "%Y-%m-%dT%H:%M:%S.%f%z")

So everytime I give this class an ISO-8601 it should return the datetime object from the string...

Python 3.7 Example:

Date("2018-12-09T08:56:12.189Z")                                        
# Returns => datetime.datetime(2018, 12, 9, 8, 56, 12, 189000, tzinfo=datetime.timezone.utc)

This works damn well, but when I use it on Python 3.6 or Python 3.5:

# Python 3.5 Traceback
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime
    (data_string, format))
ValueError: time data '2018-12-09T08:56:12.189Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

# Python 3.6 Traceback
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.6/_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '2018-12-09T08:56:12.189Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

It's so weird, What causes the problem? How can I fix it?

3
  • 3
    The one you say is Python 3.6 is using modules from Python 3.5. That's a problem. Commented Nov 14, 2018 at 0:07
  • @user2357112 I didn't have Python 3.6 installed on my desktop, but it was installed on the server, So I used my python3.5, but I also checked it on the server with python3.6 and it had the same problem Commented Nov 14, 2018 at 0:10
  • @user2357112 Added Python 3.6 Traceback as well Commented Nov 14, 2018 at 0:18

1 Answer 1

21

Ok, after 2 days, I checked the Python 3.7 changelog, and I found out support for Z as a UTC offset was added in Python 3.7. See this issue on the Python issue tracker, which is primarily about adding support for colons, but also mentions Z support further down the page. Also see the datetime docs, which say

Changed in version 3.7: When the %z directive is provided to the strptime() method, the UTC offsets can have a colon as a separator between hours, minutes and seconds. For example, '+01:00:00' will be parsed as an offset of one hour. In addition, providing 'Z' is identical to '+00:00'.

On my class, I had to change the time format to this:

datetime.datetime.strptime(dateTime, "%Y-%m-%dT%H:%M:%S.%fZ")

I changed the %z at the end to Z, hardcoding the offset.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.