Skip to content

Commit e9d5324

Browse files
[3.12] gh-114728: Fix documentation for comparison of objects in datetime module (GH-114749) (GH-114928)
(cherry picked from commit c12240e) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent e2f7aab commit e9d5324

File tree

1 file changed

+50
-68
lines changed

1 file changed

+50
-68
lines changed

Doc/library/datetime.rst

Lines changed: 50 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -400,30 +400,7 @@ objects (see below).
400400
the :func:`divmod` function. True division and multiplication of a
401401
:class:`timedelta` object by a :class:`float` object are now supported.
402402

403-
404-
Comparisons of :class:`timedelta` objects are supported, with some caveats.
405-
406-
The comparisons ``==`` or ``!=`` *always* return a :class:`bool`, no matter
407-
the type of the compared object::
408-
409-
>>> from datetime import timedelta
410-
>>> delta1 = timedelta(seconds=57)
411-
>>> delta2 = timedelta(hours=25, seconds=2)
412-
>>> delta2 != delta1
413-
True
414-
>>> delta2 == 5
415-
False
416-
417-
For all other comparisons (such as ``<`` and ``>``), when a :class:`timedelta`
418-
object is compared to an object of a different type, :exc:`TypeError`
419-
is raised::
420-
421-
>>> delta2 > delta1
422-
True
423-
>>> delta2 > 5
424-
Traceback (most recent call last):
425-
File "<stdin>", line 1, in <module>
426-
TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'
403+
:class:`timedelta` objects support equality and order comparisons.
427404

428405
In Boolean contexts, a :class:`timedelta` object is
429406
considered to be true if and only if it isn't equal to ``timedelta(0)``.
@@ -614,8 +591,13 @@ Supported operations:
614591
+-------------------------------+----------------------------------------------+
615592
| ``timedelta = date1 - date2`` | \(3) |
616593
+-------------------------------+----------------------------------------------+
617-
| ``date1 < date2`` | *date1* is considered less than *date2* when |
618-
| | *date1* precedes *date2* in time. (4) |
594+
| | ``date1 == date2`` | Equality comparison. (4) |
595+
| | ``date1 != date2`` | |
596+
+-------------------------------+----------------------------------------------+
597+
| | ``date1 < date2`` | Order comparison. (5) |
598+
| | ``date1 > date2`` | |
599+
| | ``date1 <= date2`` | |
600+
| | ``date1 >= date2`` | |
619601
+-------------------------------+----------------------------------------------+
620602

621603
Notes:
@@ -635,15 +617,12 @@ Notes:
635617
timedelta.microseconds are 0, and date2 + timedelta == date1 after.
636618

637619
(4)
620+
:class:`date` objects are equal if they represent the same date.
621+
622+
(5)
623+
*date1* is considered less than *date2* when *date1* precedes *date2* in time.
638624
In other words, ``date1 < date2`` if and only if ``date1.toordinal() <
639-
date2.toordinal()``. Date comparison raises :exc:`TypeError` if
640-
the other comparand isn't also a :class:`date` object. However,
641-
``NotImplemented`` is returned instead if the other comparand has a
642-
:attr:`~date.timetuple` attribute. This hook gives other kinds of date objects a
643-
chance at implementing mixed-type comparison. If not, when a :class:`date`
644-
object is compared to an object of a different type, :exc:`TypeError` is raised
645-
unless the comparison is ``==`` or ``!=``. The latter cases return
646-
:const:`False` or :const:`True`, respectively.
625+
date2.toordinal()``.
647626

648627
In Boolean contexts, all :class:`date` objects are considered to be true.
649628

@@ -1167,8 +1146,13 @@ Supported operations:
11671146
+---------------------------------------+--------------------------------+
11681147
| ``timedelta = datetime1 - datetime2`` | \(3) |
11691148
+---------------------------------------+--------------------------------+
1170-
| ``datetime1 < datetime2`` | Compares :class:`.datetime` to |
1171-
| | :class:`.datetime`. (4) |
1149+
| | ``datetime1 == datetime2`` | Equality comparison. (4) |
1150+
| | ``datetime1 != datetime2`` | |
1151+
+---------------------------------------+--------------------------------+
1152+
| | ``datetime1 < datetime2`` | Order comparison. (5) |
1153+
| | ``datetime1 > datetime2`` | |
1154+
| | ``datetime1 <= datetime2`` | |
1155+
| | ``datetime1 >= datetime2`` | |
11721156
+---------------------------------------+--------------------------------+
11731157

11741158
(1)
@@ -1196,40 +1180,41 @@ Supported operations:
11961180
are done in this case.
11971181

11981182
If both are aware and have different :attr:`~.datetime.tzinfo` attributes, ``a-b`` acts
1199-
as if *a* and *b* were first converted to naive UTC datetimes first. The
1183+
as if *a* and *b* were first converted to naive UTC datetimes. The
12001184
result is ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None)
12011185
- b.utcoffset())`` except that the implementation never overflows.
12021186

12031187
(4)
1188+
:class:`.datetime` objects are equal if they represent the same date
1189+
and time, taking into account the time zone.
1190+
1191+
Naive and aware :class:`!datetime` objects are never equal.
1192+
:class:`!datetime` objects are never equal to :class:`date` objects
1193+
that are not also :class:`!datetime` instances, even if they represent
1194+
the same date.
1195+
1196+
If both comparands are aware and have different :attr:`~.datetime.tzinfo`
1197+
attributes, the comparison acts as comparands were first converted to UTC
1198+
datetimes except that the implementation never overflows.
1199+
:class:`!datetime` instances in a repeated interval are never equal to
1200+
:class:`!datetime` instances in other time zone.
1201+
1202+
(5)
12041203
*datetime1* is considered less than *datetime2* when *datetime1* precedes
1205-
*datetime2* in time.
1204+
*datetime2* in time, taking into account the time zone.
12061205

1207-
If one comparand is naive and the other is aware, :exc:`TypeError`
1208-
is raised if an order comparison is attempted. For equality
1209-
comparisons, naive instances are never equal to aware instances.
1206+
Order comparison between naive and aware :class:`.datetime` objects,
1207+
as well as a :class:`!datetime` object and a :class:`!date` object
1208+
that is not also a :class:`!datetime` instance, raises :exc:`TypeError`.
12101209

1211-
If both comparands are aware, and have the same :attr:`~.datetime.tzinfo` attribute, the
1212-
common :attr:`~.datetime.tzinfo` attribute is ignored and the base datetimes are
1213-
compared. If both comparands are aware and have different :attr:`~.datetime.tzinfo`
1214-
attributes, the comparands are first adjusted by subtracting their UTC
1215-
offsets (obtained from ``self.utcoffset()``).
1210+
If both comparands are aware and have different :attr:`~.datetime.tzinfo`
1211+
attributes, the comparison acts as comparands were first converted to UTC
1212+
datetimes except that the implementation never overflows.
12161213

12171214
.. versionchanged:: 3.3
12181215
Equality comparisons between aware and naive :class:`.datetime`
12191216
instances don't raise :exc:`TypeError`.
12201217

1221-
.. note::
1222-
1223-
In order to stop comparison from falling back to the default scheme of comparing
1224-
object addresses, datetime comparison normally raises :exc:`TypeError` if the
1225-
other comparand isn't also a :class:`.datetime` object. However,
1226-
``NotImplemented`` is returned instead if the other comparand has a
1227-
:attr:`~.datetime.timetuple` attribute. This hook gives other kinds of date objects a
1228-
chance at implementing mixed-type comparison. If not, when a :class:`.datetime`
1229-
object is compared to an object of a different type, :exc:`TypeError` is raised
1230-
unless the comparison is ``==`` or ``!=``. The latter cases return
1231-
:const:`False` or :const:`True`, respectively.
1232-
12331218
Instance methods:
12341219

12351220
.. method:: datetime.date()
@@ -1760,21 +1745,18 @@ Instance attributes (read-only):
17601745

17611746
.. versionadded:: 3.6
17621747

1763-
:class:`.time` objects support comparison of :class:`.time` to :class:`.time`,
1764-
where *a* is considered less
1765-
than *b* when *a* precedes *b* in time. If one comparand is naive and the other
1766-
is aware, :exc:`TypeError` is raised if an order comparison is attempted. For equality
1767-
comparisons, naive instances are never equal to aware instances.
1748+
:class:`.time` objects support equality and order comparisons,
1749+
where *a* is considered less than *b* when *a* precedes *b* in time.
1750+
1751+
Naive and aware :class:`!time` objects are never equal.
1752+
Order comparison between naive and aware :class:`!time` objects raises
1753+
:exc:`TypeError`.
17681754

17691755
If both comparands are aware, and have
17701756
the same :attr:`~.time.tzinfo` attribute, the common :attr:`!tzinfo` attribute is
17711757
ignored and the base times are compared. If both comparands are aware and
17721758
have different :attr:`!tzinfo` attributes, the comparands are first adjusted by
1773-
subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order
1774-
to stop mixed-type comparisons from falling back to the default comparison by
1775-
object address, when a :class:`.time` object is compared to an object of a
1776-
different type, :exc:`TypeError` is raised unless the comparison is ``==`` or
1777-
``!=``. The latter cases return :const:`False` or :const:`True`, respectively.
1759+
subtracting their UTC offsets (obtained from ``self.utcoffset()``).
17781760

17791761
.. versionchanged:: 3.3
17801762
Equality comparisons between aware and naive :class:`.time` instances

0 commit comments

Comments
 (0)