Description
Bug report
Bug description:
1. Incorrect timezone validation in _pydatetime
(solved)
As far as I understand, the documentation says that Z
char should mean that tzinfo
is timezone.utc
, so there cannot be any time zone fields after it.
Based on this, _pydatetime
implementation is incorrect, right?
>>> import _datetime, _pydatetime
>>> _pydatetime.datetime.fromisoformat('2020-01-01T00:00Z00:50')
datetime.datetime(2020, 1, 1, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=3000)))
>>> _datetime.datetime.fromisoformat('2020-01-01T00:00Z00:50')
Traceback (most recent call last):
File "<python-input-54>", line 1, in <module>
_datetime.datetime.fromisoformat('2020-01-01T00:00Z00:50')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: Invalid isoformat string: '2020-01-01T00:00Z00:50'
2. Miss the wrong millisecond separator in _datetime
(solved)
In _pydatetime
the separator for milliseconds must be either a period .
or a comma ,
.
Should we allow colon :
as millisecond separator?
>>> import _datetime, _pydatetime
>>> _datetime.datetime.fromisoformat('2020-01-01T00:00:01:1')
datetime.datetime(2020, 1, 1, 0, 0, 1, 100000)
>>> _pydatetime.datetime.fromisoformat('2020-01-01T00:00:01:1')
Traceback (most recent call last):
File "<python-input-119>", line 1, in <module>
_pydatetime.datetime.fromisoformat('2020-01-01T00:00:01:1')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File ".../cpython/Lib/_pydatetime.py", line 1969, in fromisoformat
"Return local time tuple compatible with time.localtime()."
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
dst = self.dst()
^^^^^^^^^^^^^^^^
ValueError: Invalid isoformat string: '2020-01-01T00:00:01:1'
3. The first errors caught can be different
If these errors occur separately, then both implementations are able to detect them, but when there are several problems, the methods may behave differently. In this case _pydatetime
first detected an error due to the separator, and _datetime
first detected an error in exceeding the limits.
>>> import _datetime, _pydatetime
>>> _pydatetime.datetime.fromisoformat('2009-04-19T03:15:45+10:90.11')
Traceback (most recent call last):
File "<python-input-40>", line 1, in <module>
_pydatetime.datetime.fromisoformat('2009-04-19T03:15:45+10:90.11')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".../cpython/Lib/_pydatetime.py", line 1969, in fromisoformat
f'Invalid isoformat string: {date_string!r}') from None
else:
ValueError: Invalid isoformat string: '2009-04-19T03:15:45+10:90.11'
>>> _datetime.datetime.fromisoformat('2009-04-19T03:15:45+10:90.11')
Traceback (most recent call last):
File "<python-input-41>", line 1, in <module>
_datetime.datetime.fromisoformat('2009-04-19T03:15:45+10:90.11')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: minute must be in 0..59
Also also an issue has already been created about the fact that some errors have different output, here:
I'll send a PR.
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status