:mod:`!datetime` --- Basic date and time types
==============================================

.. module:: datetime
   :synopsis: Basic date and time types.

.. moduleauthor:: Tim Peters <tim@zope.com>
.. sectionauthor:: Tim Peters <tim@zope.com>
.. sectionauthor:: A.M. Kuchling <amk@amk.ca>

**Source code:** :source:`Lib/datetime.py`

--------------

.. XXX what order should the types be discussed in?

The :mod:`!datetime` module supplies classes for manipulating dates and times.

While date and time arithmetic is supported, the focus of the implementation is
on efficient attribute extraction for output formatting and manipulation.

.. tip::

    Skip to :ref:`the format codes <format-codes>`.

.. seealso::

   Module :mod:`calendar`
      General calendar related functions.

   Module :mod:`time`
      Time access and conversions.

   Module :mod:`zoneinfo`
      Concrete time zones representing the IANA time zone database.

   Package `dateutil <https://dateutil.readthedocs.io/en/stable/>`_
      Third-party library with expanded time zone and parsing support.

   Package :pypi:`DateType`
      Third-party library that introduces distinct static types to e.g. allow
      :term:`static type checkers <static type checker>`
      to differentiate between naive and aware datetimes.

.. _datetime-naive-aware:

Aware and Naive Objects
-----------------------

Date and time objects may be categorized as "aware" or "naive" depending on
whether or not they include time zone information.

With sufficient knowledge of applicable algorithmic and political time
adjustments, such as time zone and daylight saving time information,
an **aware** object can locate itself relative to other aware objects.
An aware object represents a specific moment in time that is not open to
interpretation. [#]_

A **naive** object does not contain enough information to unambiguously locate
itself relative to other date/time objects. Whether a naive object represents
Coordinated Universal Time (UTC), local time, or time in some other time zone is
purely up to the program, just like it is up to the program whether a
particular number represents metres, miles, or mass. Naive objects are easy to
understand and to work with, at the cost of ignoring some aspects of reality.

For applications requiring aware objects, :class:`.datetime` and :class:`.time`
objects have an optional time zone information attribute, :attr:`!tzinfo`, that
can be set to an instance of a subclass of the abstract :class:`tzinfo` class.
These :class:`tzinfo` objects capture information about the offset from UTC
time, the time zone name, and whether daylight saving time is in effect.

Only one concrete :class:`tzinfo` class, the :class:`timezone` class, is
supplied by the :mod:`!datetime` module. The :class:`!timezone` class can
represent simple time zones with fixed offsets from UTC, such as UTC itself or
North American EST and EDT time zones. Supporting time zones at deeper levels of
detail is up to the application. The rules for time adjustment across the
world are more political than rational, change frequently, and there is no
standard suitable for every application aside from UTC.

Constants
---------

The :mod:`!datetime` module exports the following constants:

.. data:: MINYEAR

   The smallest year number allowed in a :class:`date` or :class:`.datetime` object.
   :const:`MINYEAR` is 1.


.. data:: MAXYEAR

   The largest year number allowed in a :class:`date` or :class:`.datetime` object.
   :const:`MAXYEAR` is 9999.

.. attribute:: UTC

   Alias for the UTC time zone singleton :attr:`datetime.timezone.utc`.

   .. versionadded:: 3.11

Available Types
---------------

.. class:: date
   :noindex:

   An idealized naive date, assuming the current Gregorian calendar always was, and
   always will be, in effect. Attributes: :attr:`year`, :attr:`month`, and
   :attr:`day`.


.. class:: time
   :noindex:

   An idealized time, independent of any particular day, assuming that every day
   has exactly 24\*60\*60 seconds.  (There is no notion of "leap seconds" here.)
   Attributes: :attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond`,
   and :attr:`.tzinfo`.


.. class:: datetime
   :noindex:

   A combination of a date and a time. Attributes: :attr:`year`, :attr:`month`,
   :attr:`day`, :attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond`,
   and :attr:`.tzinfo`.


.. class:: timedelta
   :noindex:

   A duration expressing the difference between two :class:`.datetime`
   or :class:`date` instances to microsecond resolution.


.. class:: tzinfo
   :noindex:

   An abstract base class for time zone information objects. These are used by the
   :class:`.datetime` and :class:`.time` classes to provide a customizable notion of
   time adjustment (for example, to account for time zone and/or daylight saving
   time).

.. class:: timezone
   :noindex:

   A class that implements the :class:`tzinfo` abstract base class as a
   fixed offset from the UTC.

   .. versionadded:: 3.2

Objects of these types are immutable.

Subclass relationships::

   object
       timedelta
       tzinfo
           timezone
       time
       date
           datetime

Common Properties
^^^^^^^^^^^^^^^^^

The :class:`date`, :class:`.datetime`, :class:`.time`, and :class:`timezone` types
share these common features:

- Objects of these types are immutable.
- Objects of these types are :term:`hashable`, meaning that they can be used as
  dictionary keys.
- Objects of these types support efficient pickling via the :mod:`pickle` module.

Determining if an Object is Aware or Naive
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Objects of the :class:`date` type are always naive.

An object of type :class:`.time` or :class:`.datetime` may be aware or naive.

A :class:`.datetime` object ``d`` is aware if both of the following hold:

1. ``d.tzinfo`` is not ``None``
2. ``d.tzinfo.utcoffset(d)`` does not return ``None``

Otherwise, ``d`` is naive.

A :class:`.time` object ``t`` is aware if both of the following hold:

1. ``t.tzinfo`` is not ``None``
2. ``t.tzinfo.utcoffset(None)`` does not return ``None``.

Otherwise, ``t`` is naive.

The distinction between aware and naive doesn't apply to :class:`timedelta`
objects.

.. _datetime-timedelta:

:class:`timedelta` Objects
--------------------------

A :class:`timedelta` object represents a duration, the difference between two
:class:`.datetime` or :class:`date` instances.

.. class:: timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

   All arguments are optional and default to 0. Arguments may be integers
   or floats, and may be positive or negative.

   Only *days*, *seconds* and *microseconds* are stored internally.
   Arguments are converted to those units:

   * A millisecond is converted to 1000 microseconds.
   * A minute is converted to 60 seconds.
   * An hour is converted to 3600 seconds.
   * A week is converted to 7 days.

   and days, seconds and microseconds are then normalized so that the
   representation is unique, with

   * ``0 <= microseconds < 1000000``
   * ``0 <= seconds < 3600*24`` (the number of seconds in one day)
   * ``-999999999 <= days <= 999999999``

   The following example illustrates how any arguments besides
   *days*, *seconds* and *microseconds* are "merged" and normalized into those
   three resulting attributes::

       >>> from datetime import timedelta
       >>> delta = timedelta(
       ...     days=50,
       ...     seconds=27,
       ...     microseconds=10,
       ...     milliseconds=29000,
       ...     minutes=5,
       ...     hours=8,
       ...     weeks=2
       ... )
       >>> # Only days, seconds, and microseconds remain
       >>> delta
       datetime.timedelta(days=64, seconds=29156, microseconds=10)

   If any argument is a float and there are fractional microseconds,
   the fractional microseconds left over from all arguments are
   combined and their sum is rounded to the nearest microsecond using
   round-half-to-even tiebreaker. If no argument is a float, the
   conversion and normalization processes are exact (no information is
   lost).

   If the normalized value of days lies outside the indicated range,
   :exc:`OverflowError` is raised.

   Note that normalization of negative values may be surprising at first. For
   example::

      >>> from datetime import timedelta
      >>> d = timedelta(microseconds=-1)
      >>> (d.days, d.seconds, d.microseconds)
      (-1, 86399, 999999)


Class attributes:

.. attribute:: timedelta.min

   The most negative :class:`timedelta` object, ``timedelta(-999999999)``.


.. attribute:: timedelta.max

   The most positive :class:`timedelta` object, ``timedelta(days=999999999,
   hours=23, minutes=59, seconds=59, microseconds=999999)``.


.. attribute:: timedelta.resolution

   The smallest possible difference between non-equal :class:`timedelta` objects,
   ``timedelta(microseconds=1)``.

Note that, because of normalization, ``timedelta.max`` is greater than ``-timedelta.min``.
``-timedelta.max`` is not representable as a :class:`timedelta` object.


Instance attributes (read-only):

.. attribute:: timedelta.days

   Between -999,999,999 and 999,999,999 inclusive.


.. attribute:: timedelta.seconds

   Between 0 and 86,399 inclusive.

   .. caution::

      It is a somewhat common bug for code to unintentionally use this attribute
      when it is actually intended to get a :meth:`~timedelta.total_seconds`
      value instead:

      .. doctest::

         >>> from datetime import timedelta
         >>> duration = timedelta(seconds=11235813)
         >>> duration.days, duration.seconds
         (130, 3813)
         >>> duration.total_seconds()
         11235813.0

.. attribute:: timedelta.microseconds

   Between 0 and 999,999 inclusive.


Supported operations:

.. XXX this table is too wide!

+--------------------------------+-----------------------------------------------+
| Operation                      | Result                                        |
+================================+===============================================+
| ``t1 = t2 + t3``               | Sum of ``t2`` and ``t3``.                     |
|                                | Afterwards ``t1 - t2 == t3`` and              |
|                                | ``t1 - t3 == t2`` are true. (1)               |
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 - t3``               | Difference of ``t2``  and ``t3``. Afterwards  |
|                                | ``t1 == t2 - t3`` and ``t2 == t1 + t3`` are   |
|                                | true. (1)(6)                                  |
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 * i or t1 = i * t2`` | Delta multiplied by an integer.               |
|                                | Afterwards ``t1 // i == t2`` is true,         |
|                                | provided ``i != 0``.                          |
+--------------------------------+-----------------------------------------------+
|                                | In general, ``t1  * i == t1 * (i-1) + t1``    |
|                                | is true. (1)                                  |
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 * f or t1 = f * t2`` | Delta multiplied by a float. The result is    |
|                                | rounded to the nearest multiple of            |
|                                | timedelta.resolution using round-half-to-even.|
+--------------------------------+-----------------------------------------------+
| ``f = t2 / t3``                | Division (3) of overall duration ``t2`` by    |
|                                | interval unit ``t3``. Returns a :class:`float`|
|                                | object.                                       |
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 / f or t1 = t2 / i`` | Delta divided by a float or an int. The result|
|                                | is rounded to the nearest multiple of         |
|                                | timedelta.resolution using round-half-to-even.|
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 // i`` or            | The floor is computed and the remainder (if   |
| ``t1 = t2 // t3``              | any) is thrown away. In the second case, an   |
|                                | integer is returned. (3)                      |
+--------------------------------+-----------------------------------------------+
| ``t1 = t2 % t3``               | The remainder is computed as a                |
|                                | :class:`timedelta` object. (3)                |
+--------------------------------+-----------------------------------------------+
| ``q, r = divmod(t1, t2)``      | Computes the quotient and the remainder:      |
|                                | ``q = t1 // t2`` (3) and ``r = t1 % t2``.     |
|                                | ``q`` is an integer and ``r`` is a            |
|                                | :class:`timedelta` object.                    |
+--------------------------------+-----------------------------------------------+
| ``+t1``                        | Returns a :class:`timedelta` object with the  |
|                                | same value. (2)                               |
+--------------------------------+-----------------------------------------------+
| ``-t1``                        | Equivalent to ``timedelta(-t1.days,           |
|                                | -t1.seconds, -t1.microseconds)``,             |
|                                | and to ``t1 * -1``. (1)(4)                    |
+--------------------------------+-----------------------------------------------+
| ``abs(t)``                     | Equivalent to ``+t`` when ``t.days >= 0``,    |
|                                | and to ``-t`` when ``t.days < 0``. (2)        |
+--------------------------------+-----------------------------------------------+
| ``str(t)``                     | Returns a string in the form                  |
|                                | ``[D day[s], ][H]H:MM:SS[.UUUUUU]``, where D  |
|                                | is negative for negative ``t``. (5)           |
+--------------------------------+-----------------------------------------------+
| ``repr(t)``                    | Returns a string representation of the        |
|                                | :class:`timedelta` object as a constructor    |
|                                | call with canonical attribute values.         |
+--------------------------------+-----------------------------------------------+


Notes:

(1)
   This is exact but may overflow.

(2)
   This is exact and cannot overflow.

(3)
   Division by zero raises :exc:`ZeroDivisionError`.

(4)
   ``-timedelta.max`` is not representable as a :class:`timedelta` object.

(5)
   String representations of :class:`timedelta` objects are normalized
   similarly to their internal representation. This leads to somewhat
   unusual results for negative timedeltas. For example::

      >>> timedelta(hours=-5)
      datetime.timedelta(days=-1, seconds=68400)
      >>> print(_)
      -1 day, 19:00:00

(6)
   The expression ``t2 - t3`` will always be equal to the expression ``t2 + (-t3)`` except
   when t3 is equal to ``timedelta.max``; in that case the former will produce a result
   while the latter will overflow.

In addition to the operations listed above, :class:`timedelta` objects support
certain additions and subtractions with :class:`date` and :class:`.datetime`
objects (see below).

.. versionchanged:: 3.2
   Floor division and true division of a :class:`timedelta` object by another
   :class:`timedelta` object are now supported, as are remainder operations and
   the :func:`divmod` function. True division and multiplication of a
   :class:`timedelta` object by a :class:`float` object are now supported.

:class:`timedelta` objects support equality and order comparisons.

In Boolean contexts, a :class:`timedelta` object is
considered to be true if and only if it isn't equal to ``timedelta(0)``.

Instance methods:

.. method:: timedelta.total_seconds()

   Return the total number of seconds contained in the duration. Equivalent to
   ``td / timedelta(seconds=1)``. For interval units other than seconds, use the
   division form directly (e.g. ``td / timedelta(microseconds=1)``).

   Note that for very large time intervals (greater than 270 years on
   most platforms) this method will lose microsecond accuracy.

   .. versionadded:: 3.2

Examples of usage: :class:`timedelta`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

An additional example of normalization::

    >>> # Components of another_year add up to exactly 365 days
    >>> from datetime import timedelta
    >>> year = timedelta(days=365)
    >>> another_year = timedelta(weeks=40, days=84, hours=23,
    ...                          minutes=50, seconds=600)
    >>> year == another_year
    True
    >>> year.total_seconds()
    31536000.0

Examples of :class:`timedelta` arithmetic::

    >>> from datetime import timedelta
    >>> year = timedelta(days=365)
    >>> ten_years = 10 * year
    >>> ten_years
    datetime.timedelta(days=3650)
    >>> ten_years.days // 365
    10
    >>> nine_years = ten_years - year
    >>> nine_years
    datetime.timedelta(days=3285)
    >>> three_years = nine_years // 3
    >>> three_years, three_years.days // 365
    (datetime.timedelta(days=1095), 3)

.. _datetime-date:

:class:`date` Objects
---------------------

A :class:`date` object represents a date (year, month and day) in an idealized
calendar, the current Gregorian calendar indefinitely extended in both
directions.

January 1 of year 1 is called day number 1, January 2 of year 1 is
called day number 2, and so on. [#]_

.. class:: date(year, month, day)

   All arguments are required. Arguments must be integers, in the following
   ranges:

   * ``MINYEAR <= year <= MAXYEAR``
   * ``1 <= month <= 12``
   * ``1 <= day <= number of days in the given month and year``

   If an argument outside those ranges is given, :exc:`ValueError` is raised.


Other constructors, all class methods:

.. classmethod:: date.today()

   Return the current local date.

   This is equivalent to ``date.fromtimestamp(time.time())``.

.. classmethod:: date.fromtimestamp(timestamp)

   Return the local date corresponding to the POSIX timestamp, such as is
   returned by :func:`time.time`.

   This may raise :exc:`OverflowError`, if the timestamp is out
   of the range of values supported by the platform C :c:func:`localtime`
   function, and :exc:`OSError` on :c:func:`localtime` failure.
   It's common for this to be restricted to years from 1970 through 2038. Note
   that on non-POSIX systems that include leap seconds in their notion of a
   timestamp, leap seconds are ignored by :meth:`fromtimestamp`.

   .. versionchanged:: 3.3
      Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
      is out of the range of values supported by the platform C
      :c:func:`localtime` function. Raise :exc:`OSError` instead of
      :exc:`ValueError` on :c:func:`localtime` failure.


.. classmethod:: date.fromordinal(ordinal)

   Return the date corresponding to the proleptic Gregorian ordinal, where
   January 1 of year 1 has ordinal 1.

   :exc:`ValueError` is raised unless ``1 <= ordinal <=
   date.max.toordinal()``. For any date ``d``,
   ``date.fromordinal(d.toordinal()) == d``.


.. classmethod:: date.fromisoformat(date_string)

   Return a :class:`date` corresponding to a *date_string* given in any valid
   ISO 8601 format, with the following exceptions:

   1. Reduced precision dates are not currently supported (``YYYY-MM``,
      ``YYYY``).
   2. Extended date representations are not currently supported
      (``±YYYYYY-MM-DD``).
   3. Ordinal dates are not currently supported (``YYYY-OOO``).

   Examples::

      >>> from datetime import date
      >>> date.fromisoformat('2019-12-04')
      datetime.date(2019, 12, 4)
      >>> date.fromisoformat('20191204')
      datetime.date(2019, 12, 4)
      >>> date.fromisoformat('2021-W01-1')
      datetime.date(2021, 1, 4)

   .. versionadded:: 3.7
   .. versionchanged:: 3.11
      Previously, this method only supported the format ``YYYY-MM-DD``.

.. classmethod:: date.fromisocalendar(year, week, day)

   Return a :class:`date` corresponding to the ISO calendar date specified by
   year, week and day. This is the inverse of the function :meth:`date.isocalendar`.

   .. versionadded:: 3.8

.. classmethod:: date.strptime(date_string, format)

   Return a :class:`.date` corresponding to *date_string*, parsed according to
   *format*. This is equivalent to::

     date(*(time.strptime(date_string, format)[0:3]))

   :exc:`ValueError` is raised if the date_string and format
   can't be parsed by :func:`time.strptime` or if it returns a value which isn't a
   time tuple.  See also :ref:`strftime-strptime-behavior` and
   :meth:`date.fromisoformat`.

   .. note::

      If *format* specifies a day of month without a year a
      :exc:`DeprecationWarning` is emitted.  This is to avoid a quadrennial
      leap year bug in code seeking to parse only a month and day as the
      default year used in absence of one in the format is not a leap year.
      Such *format* values may raise an error as of Python 3.15.  The
      workaround is to always include a year in your *format*.  If parsing
      *date_string* values that do not have a year, explicitly add a year that
      is a leap year before parsing:

      .. doctest::

         >>> from datetime import date
         >>> date_string = "02/29"
         >>> when = date.strptime(f"{date_string};1984", "%m/%d;%Y")  # Avoids leap year bug.
         >>> when.strftime("%B %d")  # doctest: +SKIP
         'February 29'

   .. versionadded:: 3.14


Class attributes:

.. attribute:: date.min

   The earliest representable date, ``date(MINYEAR, 1, 1)``.


.. attribute:: date.max

   The latest representable date, ``date(MAXYEAR, 12, 31)``.


.. attribute:: date.resolution

   The smallest possible difference between non-equal date objects,
   ``timedelta(days=1)``.


Instance attributes (read-only):

.. attribute:: date.year

   Between :const:`MINYEAR` and :const:`MAXYEAR` inclusive.


.. attribute:: date.month

   Between 1 and 12 inclusive.


.. attribute:: date.day

   Between 1 and the number of days in the given month of the given year.


Supported operations:

+-------------------------------+----------------------------------------------+
| Operation                     | Result                                       |
+===============================+==============================================+
| ``date2 = date1 + timedelta`` | ``date2`` will be ``timedelta.days`` days    |
|                               | after ``date1``. (1)                         |
+-------------------------------+----------------------------------------------+
| ``date2 = date1 - timedelta`` | Computes ``date2`` such that ``date2 +       |
|                               | timedelta == date1``. (2)                    |
+-------------------------------+----------------------------------------------+
| ``timedelta = date1 - date2`` | \(3)                                         |
+-------------------------------+----------------------------------------------+
| | ``date1 == date2``          | Equality comparison. (4)                     |
| | ``date1 != date2``          |                                              |
+-------------------------------+----------------------------------------------+
| | ``date1 < date2``           | Order comparison. (5)                        |
| | ``date1 > date2``           |                                              |
| | ``date1 <= date2``          |                                              |
| | ``date1 >= date2``          |                                              |
+-------------------------------+----------------------------------------------+

Notes:

(1)
   *date2* is moved forward in time if ``timedelta.days > 0``, or backward if
   ``timedelta.days < 0``. Afterward ``date2 - date1 == timedelta.days``.
   ``timedelta.seconds`` and ``timedelta.microseconds`` are ignored.
   :exc:`OverflowError` is raised if ``date2.year`` would be smaller than
   :const:`MINYEAR` or larger than :const:`MAXYEAR`.

(2)
   ``timedelta.seconds`` and ``timedelta.microseconds`` are ignored.

(3)
   This is exact, and cannot overflow. ``timedelta.seconds`` and
   ``timedelta.microseconds`` are 0, and ``date2 + timedelta == date1`` after.

(4)
   :class:`date` objects are equal if they represent the same date.

   :class:`!date` objects that are not also :class:`.datetime` instances
   are never equal to :class:`!datetime` objects, even if they represent
   the same date.

(5)
   *date1* is considered less than *date2* when *date1* precedes *date2* in time.
   In other words, ``date1 < date2`` if and only if ``date1.toordinal() <
   date2.toordinal()``.

   Order comparison between a :class:`!date` object that is not also a
   :class:`.datetime` instance and a :class:`!datetime` object raises
   :exc:`TypeError`.

.. versionchanged:: 3.13
   Comparison between :class:`.datetime` object and an instance of
   the :class:`date` subclass that is not a :class:`!datetime` subclass
   no longer converts the latter to :class:`!date`, ignoring the time part
   and the time zone.
   The default behavior can be changed by overriding the special comparison
   methods in subclasses.

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

Instance methods:

.. method:: date.replace(year=self.year, month=self.month, day=self.day)

   Return a date with the same value, except for those parameters given new
   values by whichever keyword arguments are specified.

   Example::

       >>> from datetime import date
       >>> d = date(2002, 12, 31)
       >>> d.replace(day=26)
       datetime.date(2002, 12, 26)

   :class:`date` objects are also supported by generic function
   :func:`copy.replace`.


.. method:: date.timetuple()

   Return a :class:`time.struct_time` such as returned by :func:`time.localtime`.

   The hours, minutes and seconds are 0, and the DST flag is -1.

   ``d.timetuple()`` is equivalent to::

     time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))

   where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1``
   is the day number within the current year starting with 1 for January 1st.


.. method:: date.toordinal()

   Return the proleptic Gregorian ordinal of the date, where January 1 of year 1
   has ordinal 1. For any :class:`date` object ``d``,
   ``date.fromordinal(d.toordinal()) == d``.


.. method:: date.weekday()

   Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
   For example, ``date(2002, 12, 4).weekday() == 2``, a Wednesday. See also
   :meth:`isoweekday`.


.. method:: date.isoweekday()

   Return the day of the week as an integer, where Monday is 1 and Sunday is 7.
   For example, ``date(2002, 12, 4).isoweekday() == 3``, a Wednesday. See also
   :meth:`weekday`, :meth:`isocalendar`.


.. method:: date.isocalendar()

   Return a :term:`named tuple` object with three components: ``year``,
   ``week`` and ``weekday``.

   The ISO calendar is a widely used variant of the Gregorian calendar. [#]_

   The ISO year consists of 52 or 53 full weeks, and where a week starts on a
   Monday and ends on a Sunday. The first week of an ISO year is the first
   (Gregorian) calendar week of a year containing a Thursday. This is called week
   number 1, and the ISO year of that Thursday is the same as its Gregorian year.

   For example, 2004 begins on a Thursday, so the first week of ISO year 2004
   begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004::

        >>> from datetime import date
        >>> date(2003, 12, 29).isocalendar()
        datetime.IsoCalendarDate(year=2004, week=1, weekday=1)
        >>> date(2004, 1, 4).isocalendar()
        datetime.IsoCalendarDate(year=2004, week=1, weekday=7)

   .. versionchanged:: 3.9
      Result changed from a tuple to a :term:`named tuple`.

.. method:: date.isoformat()

   Return a string representing the date in ISO 8601 format, ``YYYY-MM-DD``::

       >>> from datetime import date
       >>> date(2002, 12, 4).isoformat()
       '2002-12-04'

.. method:: date.__str__()

   For a date ``d``, ``str(d)`` is equivalent to ``d.isoformat()``.


.. method:: date.ctime()

   Return a string representing the date::

       >>> from datetime import date
       >>> date(2002, 12, 4).ctime()
       'Wed Dec  4 00:00:00 2002'

   ``d.ctime()`` is equivalent to::

     time.ctime(time.mktime(d.timetuple()))

   on platforms where the native C
   :c:func:`ctime` function (which :func:`time.ctime` invokes, but which
   :meth:`date.ctime` does not invoke) conforms to the C standard.


.. method:: date.strftime(format)

   Return a string representing the date, controlled by an explicit format string.
   Format codes referring to hours, minutes or seconds will see 0 values.
   See also :ref:`strftime-strptime-behavior` and :meth:`date.isoformat`.


.. method:: date.__format__(format)

   Same as :meth:`.date.strftime`. This makes it possible to specify a format
   string for a :class:`.date` object in :ref:`formatted string
   literals <f-strings>` and when using :meth:`str.format`.
   See also :ref:`strftime-strptime-behavior` and :meth:`date.isoformat`.

Examples of Usage: :class:`date`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Example of counting days to an event::

    >>> import time
    >>> from datetime import date
    >>> today = date.today()
    >>> today
    datetime.date(2007, 12, 5)
    >>> today == date.fromtimestamp(time.time())
    True
    >>> my_birthday = date(today.year, 6, 24)
    >>> if my_birthday < today:
    ...     my_birthday = my_birthday.replace(year=today.year + 1)
    ...
    >>> my_birthday
    datetime.date(2008, 6, 24)
    >>> time_to_birthday = abs(my_birthday - today)
    >>> time_to_birthday.days
    202

More examples of working with :class:`date`:

.. doctest::

    >>> from datetime import date
    >>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
    >>> d
    datetime.date(2002, 3, 11)

    >>> # Methods related to formatting string output
    >>> d.isoformat()
    '2002-03-11'
    >>> d.strftime("%d/%m/%y")
    '11/03/02'
    >>> d.strftime("%A %d. %B %Y")
    'Monday 11. March 2002'
    >>> d.ctime()
    'Mon Mar 11 00:00:00 2002'
    >>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
    'The day is 11, the month is March.'

    >>> # Methods for to extracting 'components' under different calendars
    >>> t = d.timetuple()
    >>> for i in t:     # doctest: +SKIP
    ...     print(i)
    2002                # year
    3                   # month
    11                  # day
    0
    0
    0
    0                   # weekday (0 = Monday)
    70                  # 70th day in the year
    -1
    >>> ic = d.isocalendar()
    >>> for i in ic:    # doctest: +SKIP
    ...     print(i)
    2002                # ISO year
    11                  # ISO week number
    1                   # ISO day number ( 1 = Monday )

    >>> # A date object is immutable; all operations produce a new object
    >>> d.replace(year=2005)
    datetime.date(2005, 3, 11)


.. _datetime-datetime:

:class:`.datetime` Objects
--------------------------

A :class:`.datetime` object is a single object containing all the information
from a :class:`date` object and a :class:`.time` object.

Like a :class:`date` object, :class:`.datetime` assumes the current Gregorian
calendar extended in both directions; like a :class:`.time` object,
:class:`.datetime` assumes there are exactly 3600\*24 seconds in every day.

Constructor:

.. class:: datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

   The *year*, *month* and *day* arguments are required. *tzinfo* may be ``None``, or an
   instance of a :class:`tzinfo` subclass. The remaining arguments must be integers
   in the following ranges:

   * ``MINYEAR <= year <= MAXYEAR``,
   * ``1 <= month <= 12``,
   * ``1 <= day <= number of days in the given month and year``,
   * ``0 <= hour < 24``,
   * ``0 <= minute < 60``,
   * ``0 <= second < 60``,
   * ``0 <= microsecond < 1000000``,
   * ``fold in [0, 1]``.

   If an argument outside those ranges is given, :exc:`ValueError` is raised.

   .. versionchanged:: 3.6
      Added the *fold* parameter.

Other constructors, all class methods:

.. classmethod:: datetime.today()

   Return the current local date and time, with :attr:`.tzinfo` ``None``.

   Equivalent to::

     datetime.fromtimestamp(time.time())

   See also :meth:`now`, :meth:`fromtimestamp`.

   This method is functionally equivalent to :meth:`now`, but without a
   ``tz`` parameter.

.. classmethod:: datetime.now(tz=None)

   Return the current local date and time.

   If optional argument *tz* is ``None``
   or not specified, this is like :meth:`today`, but, if possible, supplies more
   precision than can be gotten from going through a :func:`time.time` timestamp
   (for example, this may be possible on platforms supplying the C
   :c:func:`gettimeofday` function).

   If *tz* is not ``None``, it must be an instance of a :class:`tzinfo` subclass,
   and the current date and time are converted to *tz*’s time zone.

   This function is preferred over :meth:`today` and :meth:`utcnow`.

   .. note::

      Subsequent calls to :meth:`!datetime.now` may return the same
      instant depending on the precision of the underlying clock.

.. classmethod:: datetime.utcnow()

   Return the current UTC date and time, with :attr:`.tzinfo` ``None``.

   This is like :meth:`now`, but returns the current UTC date and time, as a naive
   :class:`.datetime` object. An aware current UTC datetime can be obtained by
   calling ``datetime.now(timezone.utc)``. See also :meth:`now`.

   .. warning::

      Because naive ``datetime`` objects are treated by many ``datetime`` methods
      as local times, it is preferred to use aware datetimes to represent times
      in UTC. As such, the recommended way to create an object representing the
      current time in UTC is by calling ``datetime.now(timezone.utc)``.

   .. deprecated:: 3.12

      Use :meth:`datetime.now` with :attr:`UTC` instead.


.. classmethod:: datetime.fromtimestamp(timestamp, tz=None)

   Return the local date and time corresponding to the POSIX timestamp, such as is
   returned by :func:`time.time`. If optional argument *tz* is ``None`` or not
   specified, the timestamp is converted to the platform's local date and time, and
   the returned :class:`.datetime` object is naive.

   If *tz* is not ``None``, it must be an instance of a :class:`tzinfo` subclass, and the
   timestamp is converted to *tz*’s time zone.

   :meth:`fromtimestamp` may raise :exc:`OverflowError`, if the timestamp is out of
   the range of values supported by the platform C :c:func:`localtime` or
   :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or
   :c:func:`gmtime` failure.
   It's common for this to be restricted to years in
   1970 through 2038. Note that on non-POSIX systems that include leap seconds in
   their notion of a timestamp, leap seconds are ignored by :meth:`fromtimestamp`,
   and then it's possible to have two timestamps differing by a second that yield
   identical :class:`.datetime` objects. This method is preferred over
   :meth:`utcfromtimestamp`.

   .. versionchanged:: 3.3
      Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
      is out of the range of values supported by the platform C
      :c:func:`localtime` or :c:func:`gmtime` functions. Raise :exc:`OSError`
      instead of :exc:`ValueError` on :c:func:`localtime` or :c:func:`gmtime`
      failure.

   .. versionchanged:: 3.6
      :meth:`fromtimestamp` may return instances with :attr:`.fold` set to 1.

.. classmethod:: datetime.utcfromtimestamp(timestamp)

   Return the UTC :class:`.datetime` corresponding to the POSIX timestamp, with
   :attr:`.tzinfo` ``None``.  (The resulting object is naive.)

   This may raise :exc:`OverflowError`, if the timestamp is
   out of the range of values supported by the platform C :c:func:`gmtime` function,
   and :exc:`OSError` on :c:func:`gmtime` failure.
   It's common for this to be restricted to years in 1970 through 2038.

   To get an aware :class:`.datetime` object, call :meth:`fromtimestamp`::

     datetime.fromtimestamp(timestamp, timezone.utc)

   On the POSIX compliant platforms, it is equivalent to the following
   expression::

     datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)

   except the latter formula always supports the full years range: between
   :const:`MINYEAR` and :const:`MAXYEAR` inclusive.

   .. warning::

      Because naive ``datetime`` objects are treated by many ``datetime`` methods
      as local times, it is preferred to use aware datetimes to represent times
      in UTC. As such, the recommended way to create an object representing a
      specific timestamp in UTC is by calling
      ``datetime.fromtimestamp(timestamp, tz=timezone.utc)``.

   .. versionchanged:: 3.3
      Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp
      is out of the range of values supported by the platform C
      :c:func:`gmtime` function. Raise :exc:`OSError` instead of
      :exc:`ValueError` on :c:func:`gmtime` failure.

   .. deprecated:: 3.12

      Use :meth:`datetime.fromtimestamp` with :attr:`UTC` instead.


.. classmethod:: datetime.fromordinal(ordinal)

   Return the :class:`.datetime` corresponding to the proleptic Gregorian ordinal,
   where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless
   ``1 <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and
   microsecond of the result are all 0, and :attr:`.tzinfo` is ``None``.


.. classmethod:: datetime.combine(date, time, tzinfo=time.tzinfo)

   Return a new :class:`.datetime` object whose date components are equal to the
   given :class:`date` object's, and whose time components
   are equal to the given :class:`.time` object's. If the *tzinfo*
   argument is provided, its value is used to set the :attr:`.tzinfo` attribute
   of the result, otherwise the :attr:`~.time.tzinfo` attribute of the *time* argument
   is used.  If the *date* argument is a :class:`.datetime` object, its time components
   and :attr:`.tzinfo` attributes are ignored.

   For any :class:`.datetime` object ``d``,
   ``d == datetime.combine(d.date(), d.time(), d.tzinfo)``.

   .. versionchanged:: 3.6
      Added the *tzinfo* argument.


.. classmethod:: datetime.fromisoformat(date_string)

   Return a :class:`.datetime` corresponding to a *date_string* in any valid
   ISO 8601 format, with the following exceptions:

   1. Time zone offsets may have fractional seconds.
   2. The ``T`` separator may be replaced by any single unicode character.
   3. Fractional hours and minutes are not supported.
   4. Reduced precision dates are not currently supported (``YYYY-MM``,
      ``YYYY``).
   5. Extended date representations are not currently supported
      (``±YYYYYY-MM-DD``).
   6. Ordinal dates are not currently supported (``YYYY-OOO``).

   Examples::

       >>> from datetime import datetime
       >>> datetime.fromisoformat('2011-11-04')
       datetime.datetime(2011, 11, 4, 0, 0)
       >>> datetime.fromisoformat('20111104')
       datetime.datetime(2011, 11, 4, 0, 0)
       >>> datetime.fromisoformat('2011-11-04T00:05:23')
       datetime.datetime(2011, 11, 4, 0, 5, 23)
       >>> datetime.fromisoformat('2011-11-04T00:05:23Z')
       datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
       >>> datetime.fromisoformat('20111104T000523')
       datetime.datetime(2011, 11, 4, 0, 5, 23)
       >>> datetime.fromisoformat('2011-W01-2T00:05:23.283')
       datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
       >>> datetime.fromisoformat('2011-11-04 00:05:23.283')
       datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
       >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
       datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
       >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00')   # doctest: +NORMALIZE_WHITESPACE
       datetime.datetime(2011, 11, 4, 0, 5, 23,
           tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

   .. versionadded:: 3.7
   .. versionchanged:: 3.11
      Previously, this method only supported formats that could be emitted by
      :meth:`date.isoformat` or :meth:`datetime.isoformat`.


.. classmethod:: datetime.fromisocalendar(year, week, day)

   Return a :class:`.datetime` corresponding to the ISO calendar date specified
   by year, week and day. The non-date components of the datetime are populated
   with their normal default values. This is the inverse of the function
   :meth:`datetime.isocalendar`.

   .. versionadded:: 3.8

.. classmethod:: datetime.strptime(date_string, format)

   Return a :class:`.datetime` corresponding to *date_string*, parsed according to
   *format*.

   If *format* does not contain microseconds or time zone information, this is equivalent to::

     datetime(*(time.strptime(date_string, format)[0:6]))

   :exc:`ValueError` is raised if the date_string and format
   can't be parsed by :func:`time.strptime` or if it returns a value which isn't a
   time tuple.  See also :ref:`strftime-strptime-behavior` and
   :meth:`datetime.fromisoformat`.

   .. versionchanged:: 3.13

      If *format* specifies a day of month without a year a
      :exc:`DeprecationWarning` is now emitted.  This is to avoid a quadrennial
      leap year bug in code seeking to parse only a month and day as the
      default year used in absence of one in the format is not a leap year.
      Such *format* values may raise an error as of Python 3.15.  The
      workaround is to always include a year in your *format*.  If parsing
      *date_string* values that do not have a year, explicitly add a year that
      is a leap year before parsing:

      .. doctest::

         >>> from datetime import datetime
         >>> date_string = "02/29"
         >>> when = datetime.strptime(f"{date_string};1984", "%m/%d;%Y")  # Avoids leap year bug.
         >>> when.strftime("%B %d")  # doctest: +SKIP
         'February 29'


Class attributes:

.. attribute:: datetime.min

   The earliest representable :class:`.datetime`, ``datetime(MINYEAR, 1, 1,
   tzinfo=None)``.


.. attribute:: datetime.max

   The latest representable :class:`.datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59,
   59, 999999, tzinfo=None)``.


.. attribute:: datetime.resolution

   The smallest possible difference between non-equal :class:`.datetime` objects,
   ``timedelta(microseconds=1)``.


Instance attributes (read-only):

.. attribute:: datetime.year

   Between :const:`MINYEAR` and :const:`MAXYEAR` inclusive.


.. attribute:: datetime.month

   Between 1 and 12 inclusive.


.. attribute:: datetime.day

   Between 1 and the number of days in the given month of the given year.


.. attribute:: datetime.hour

   In ``range(24)``.


.. attribute:: datetime.minute

   In ``range(60)``.


.. attribute:: datetime.second

   In ``range(60)``.


.. attribute:: datetime.microsecond

   In ``range(1000000)``.


.. attribute:: datetime.tzinfo

   The object passed as the *tzinfo* argument to the :class:`.datetime` constructor,
   or ``None`` if none was passed.


.. attribute:: datetime.fold

   In ``[0, 1]``. Used to disambiguate wall times during a repeated interval. (A
   repeated interval occurs when clocks are rolled back at the end of daylight saving
   time or when the UTC offset for the current zone is decreased for political reasons.)
   The values 0 and 1 represent, respectively, the earlier and later of the two
   moments with the same wall time representation.

   .. versionadded:: 3.6

Supported operations:

+---------------------------------------+--------------------------------+
| Operation                             | Result                         |
+=======================================+================================+
| ``datetime2 = datetime1 + timedelta`` | \(1)                           |
+---------------------------------------+--------------------------------+
| ``datetime2 = datetime1 - timedelta`` | \(2)                           |
+---------------------------------------+--------------------------------+
| ``timedelta = datetime1 - datetime2`` | \(3)                           |
+---------------------------------------+--------------------------------+
| | ``datetime1 == datetime2``          | Equality comparison. (4)       |
| | ``datetime1 != datetime2``          |                                |
+---------------------------------------+--------------------------------+
| | ``datetime1 < datetime2``           | Order comparison. (5)          |
| | ``datetime1 > datetime2``           |                                |
| | ``datetime1 <= datetime2``          |                                |
| | ``datetime1 >= datetime2``          |                                |
+---------------------------------------+--------------------------------+

(1)
   ``datetime2`` is a duration of ``timedelta`` removed from ``datetime1``, moving forward in
   time if ``timedelta.days > 0``, or backward if ``timedelta.days < 0``. The
   result has the same :attr:`~.datetime.tzinfo` attribute as the input datetime, and
   ``datetime2 - datetime1 == timedelta`` after. :exc:`OverflowError` is raised if
   ``datetime2.year`` would be smaller than :const:`MINYEAR` or larger than
   :const:`MAXYEAR`. Note that no time zone adjustments are done even if the
   input is an aware object.

(2)
   Computes the ``datetime2`` such that ``datetime2 + timedelta == datetime1``. As for
   addition, the result has the same :attr:`~.datetime.tzinfo` attribute as the input
   datetime, and no time zone adjustments are done even if the input is aware.

(3)
   Subtraction of a :class:`.datetime` from a :class:`.datetime` is defined only if
   both operands are naive, or if both are aware. If one is aware and the other is
   naive, :exc:`TypeError` is raised.

   If both are naive, or both are aware and have the same :attr:`~.datetime.tzinfo` attribute,
   the :attr:`~.datetime.tzinfo` attributes are ignored, and the result is a :class:`timedelta`
   object ``t`` such that ``datetime2 + t == datetime1``. No time zone adjustments
   are done in this case.

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

(4)
   :class:`.datetime` objects are equal if they represent the same date
   and time, taking into account the time zone.

   Naive and aware :class:`!datetime` objects are never equal.

   If both comparands are aware, and have the same :attr:`!tzinfo` attribute,
   the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and
   the base datetimes are compared.
   If both comparands are aware and have different :attr:`~.datetime.tzinfo`
   attributes, the comparison acts as comparands were first converted to UTC
   datetimes except that the implementation never overflows.
   :class:`!datetime` instances in a repeated interval are never equal to
   :class:`!datetime` instances in other time zone.

(5)
   *datetime1* is considered less than *datetime2* when *datetime1* precedes
   *datetime2* in time, taking into account the time zone.

   Order comparison between naive and aware :class:`.datetime` objects
   raises :exc:`TypeError`.

   If both comparands are aware, and have the same :attr:`!tzinfo` attribute,
   the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and
   the base datetimes are compared.
   If both comparands are aware and have different :attr:`~.datetime.tzinfo`
   attributes, the comparison acts as comparands were first converted to UTC
   datetimes except that the implementation never overflows.

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

.. versionchanged:: 3.13
   Comparison between :class:`.datetime` object and an instance of
   the :class:`date` subclass that is not a :class:`!datetime` subclass
   no longer converts the latter to :class:`!date`, ignoring the time part
   and the time zone.
   The default behavior can be changed by overriding the special comparison
   methods in subclasses.

Instance methods:

.. method:: datetime.date()

   Return :class:`date` object with same year, month and day.


.. method:: datetime.time()

   Return :class:`.time` object with same hour, minute, second, microsecond and fold.
   :attr:`.tzinfo` is ``None``. See also method :meth:`timetz`.

   .. versionchanged:: 3.6
      The fold value is copied to the returned :class:`.time` object.


.. method:: datetime.timetz()

   Return :class:`.time` object with same hour, minute, second, microsecond, fold, and
   tzinfo attributes. See also method :meth:`time`.

   .. versionchanged:: 3.6
      The fold value is copied to the returned :class:`.time` object.


.. method:: datetime.replace(year=self.year, month=self.month, day=self.day, \
   hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, \
   tzinfo=self.tzinfo, *, fold=0)

   Return a datetime with the same attributes, except for those attributes given
   new values by whichever keyword arguments are specified. Note that
   ``tzinfo=None`` can be specified to create a naive datetime from an aware
   datetime with no conversion of date and time data.

   :class:`.datetime` objects are also supported by generic function
   :func:`copy.replace`.

   .. versionchanged:: 3.6
      Added the *fold* parameter.


.. method:: datetime.astimezone(tz=None)

   Return a :class:`.datetime` object with new :attr:`.tzinfo` attribute *tz*,
   adjusting the date and time data so the result is the same UTC time as
   *self*, but in *tz*'s local time.

   If provided, *tz* must be an instance of a :class:`tzinfo` subclass, and its
   :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. If *self*
   is naive, it is presumed to represent time in the system time zone.

   If called without arguments (or with ``tz=None``) the system local
   time zone is assumed for the target time zone. The ``.tzinfo`` attribute of the converted
   datetime instance will be set to an instance of :class:`timezone`
   with the zone name and offset obtained from the OS.

   If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*:  no
   adjustment of date or time data is performed. Else the result is local
   time in the time zone *tz*, representing the same UTC time as *self*:  after
   ``astz = dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will have
   the same date and time data as ``dt - dt.utcoffset()``.

   If you merely want to attach a :class:`timezone` object *tz* to a datetime *dt* without
   adjustment of date and time data, use ``dt.replace(tzinfo=tz)``. If you
   merely want to remove the :class:`!timezone` object from an aware datetime *dt* without
   conversion of date and time data, use ``dt.replace(tzinfo=None)``.

   Note that the default :meth:`tzinfo.fromutc` method can be overridden in a
   :class:`tzinfo` subclass to affect the result returned by :meth:`astimezone`.
   Ignoring error cases, :meth:`astimezone` acts like::

      def astimezone(self, tz):
          if self.tzinfo is tz:
              return self
          # Convert self to UTC, and attach the new timezone object.
          utc = (self - self.utcoffset()).replace(tzinfo=tz)
          # Convert from UTC to tz's local time.
          return tz.fromutc(utc)

   .. versionchanged:: 3.3
      *tz* now can be omitted.

   .. versionchanged:: 3.6
      The :meth:`astimezone` method can now be called on naive instances that
      are presumed to represent system local time.


.. method:: datetime.utcoffset()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.utcoffset(self)``, and raises an exception if the latter doesn't
   return ``None`` or a :class:`timedelta` object with magnitude less than one day.

   .. versionchanged:: 3.7
      The UTC offset is not restricted to a whole number of minutes.


.. method:: datetime.dst()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.dst(self)``, and raises an exception if the latter doesn't return
   ``None`` or a :class:`timedelta` object with magnitude less than one day.

   .. versionchanged:: 3.7
      The DST offset is not restricted to a whole number of minutes.


.. method:: datetime.tzname()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.tzname(self)``, raises an exception if the latter doesn't return
   ``None`` or a string object,


.. method:: datetime.timetuple()

   Return a :class:`time.struct_time` such as returned by :func:`time.localtime`.

   ``d.timetuple()`` is equivalent to::

     time.struct_time((d.year, d.month, d.day,
                       d.hour, d.minute, d.second,
                       d.weekday(), yday, dst))

   where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1``
   is the day number within the current year starting with 1 for January
   1st. The :attr:`~time.struct_time.tm_isdst` flag of the result is set according to the
   :meth:`dst` method: :attr:`.tzinfo` is ``None`` or :meth:`dst` returns
   ``None``, :attr:`!tm_isdst` is set to ``-1``; else if :meth:`dst` returns a
   non-zero value, :attr:`!tm_isdst` is set to 1; else :attr:`!tm_isdst` is
   set to 0.


.. method:: datetime.utctimetuple()

   If :class:`.datetime` instance ``d`` is naive, this is the same as
   ``d.timetuple()`` except that :attr:`~.time.struct_time.tm_isdst` is forced to 0 regardless of what
   ``d.dst()`` returns. DST is never in effect for a UTC time.

   If ``d`` is aware, ``d`` is normalized to UTC time, by subtracting
   ``d.utcoffset()``, and a :class:`time.struct_time` for the
   normalized time is returned. :attr:`!tm_isdst` is forced to 0. Note
   that an :exc:`OverflowError` may be raised if ``d.year`` was
   ``MINYEAR`` or ``MAXYEAR`` and UTC adjustment spills over a year
   boundary.

   .. warning::

      Because naive ``datetime`` objects are treated by many ``datetime`` methods
      as local times, it is preferred to use aware datetimes to represent times
      in UTC; as a result, using :meth:`datetime.utctimetuple` may give misleading
      results. If you have a naive ``datetime`` representing UTC, use
      ``datetime.replace(tzinfo=timezone.utc)`` to make it aware, at which point
      you can use :meth:`.datetime.timetuple`.

.. method:: datetime.toordinal()

   Return the proleptic Gregorian ordinal of the date. The same as
   ``self.date().toordinal()``.

.. method:: datetime.timestamp()

   Return POSIX timestamp corresponding to the :class:`.datetime`
   instance. The return value is a :class:`float` similar to that
   returned by :func:`time.time`.

   Naive :class:`.datetime` instances are assumed to represent local
   time and this method relies on the platform C :c:func:`mktime`
   function to perform the conversion. Since :class:`.datetime`
   supports wider range of values than :c:func:`mktime` on many
   platforms, this method may raise :exc:`OverflowError` or :exc:`OSError`
   for times far in the past or far in the future.

   For aware :class:`.datetime` instances, the return value is computed
   as::

      (dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

   .. versionadded:: 3.3

   .. versionchanged:: 3.6
      The :meth:`timestamp` method uses the :attr:`.fold` attribute to
      disambiguate the times during a repeated interval.

   .. note::

      There is no method to obtain the POSIX timestamp directly from a
      naive :class:`.datetime` instance representing UTC time. If your
      application uses this convention and your system time zone is not
      set to UTC, you can obtain the POSIX timestamp by supplying
      ``tzinfo=timezone.utc``::

         timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

      or by calculating the timestamp directly::

         timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

.. method:: datetime.weekday()

   Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
   The same as ``self.date().weekday()``. See also :meth:`isoweekday`.


.. method:: datetime.isoweekday()

   Return the day of the week as an integer, where Monday is 1 and Sunday is 7.
   The same as ``self.date().isoweekday()``. See also :meth:`weekday`,
   :meth:`isocalendar`.


.. method:: datetime.isocalendar()

   Return a :term:`named tuple` with three components: ``year``, ``week``
   and ``weekday``. The same as ``self.date().isocalendar()``.


.. method:: datetime.isoformat(sep='T', timespec='auto')

   Return a string representing the date and time in ISO 8601 format:

   - ``YYYY-MM-DDTHH:MM:SS.ffffff``, if :attr:`microsecond` is not 0
   - ``YYYY-MM-DDTHH:MM:SS``, if :attr:`microsecond` is 0

   If :meth:`utcoffset` does not return ``None``, a string is
   appended, giving the UTC offset:

   - ``YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``, if :attr:`microsecond`
     is not 0
   - ``YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]``,  if :attr:`microsecond` is 0

   Examples::

       >>> from datetime import datetime, timezone
       >>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
       '2019-05-18T15:17:08.132263'
       >>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat()
       '2019-05-18T15:17:00+00:00'

   The optional argument *sep* (default ``'T'``) is a one-character separator,
   placed between the date and time portions of the result. For example::

      >>> from datetime import tzinfo, timedelta, datetime
      >>> class TZ(tzinfo):
      ...     """A time zone with an arbitrary, constant -06:39 offset."""
      ...     def utcoffset(self, dt):
      ...         return timedelta(hours=-6, minutes=-39)
      ...
      >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
      '2002-12-25 00:00:00-06:39'
      >>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()
      '2009-11-27T00:00:00.000100-06:39'

   The optional argument *timespec* specifies the number of additional
   components of the time to include (the default is ``'auto'``).
   It can be one of the following:

   - ``'auto'``: Same as ``'seconds'`` if :attr:`microsecond` is 0,
     same as ``'microseconds'`` otherwise.
   - ``'hours'``: Include the :attr:`hour` in the two-digit ``HH`` format.
   - ``'minutes'``: Include :attr:`hour` and :attr:`minute` in ``HH:MM`` format.
   - ``'seconds'``: Include :attr:`hour`, :attr:`minute`, and :attr:`second`
     in ``HH:MM:SS`` format.
   - ``'milliseconds'``: Include full time, but truncate fractional second
     part to milliseconds. ``HH:MM:SS.sss`` format.
   - ``'microseconds'``: Include full time in ``HH:MM:SS.ffffff`` format.

   .. note::

      Excluded time components are truncated, not rounded.

   :exc:`ValueError` will be raised on an invalid *timespec* argument::


      >>> from datetime import datetime
      >>> datetime.now().isoformat(timespec='minutes')   # doctest: +SKIP
      '2002-12-25T00:00'
      >>> dt = datetime(2015, 1, 1, 12, 30, 59, 0)
      >>> dt.isoformat(timespec='microseconds')
      '2015-01-01T12:30:59.000000'

   .. versionchanged:: 3.6
      Added the *timespec* parameter.


.. method:: datetime.__str__()

   For a :class:`.datetime` instance ``d``, ``str(d)`` is equivalent to
   ``d.isoformat(' ')``.


.. method:: datetime.ctime()

   Return a string representing the date and time::

       >>> from datetime import datetime
       >>> datetime(2002, 12, 4, 20, 30, 40).ctime()
       'Wed Dec  4 20:30:40 2002'

   The output string will *not* include time zone information, regardless
   of whether the input is aware or naive.

   ``d.ctime()`` is equivalent to::

     time.ctime(time.mktime(d.timetuple()))

   on platforms where the native C :c:func:`ctime` function
   (which :func:`time.ctime` invokes, but which
   :meth:`datetime.ctime` does not invoke) conforms to the C standard.


.. method:: datetime.strftime(format)

   Return a string representing the date and time,
   controlled by an explicit format string.
   See also :ref:`strftime-strptime-behavior` and :meth:`datetime.isoformat`.


.. method:: datetime.__format__(format)

   Same as :meth:`.datetime.strftime`. This makes it possible to specify a format
   string for a :class:`.datetime` object in :ref:`formatted string
   literals <f-strings>` and when using :meth:`str.format`.
   See also :ref:`strftime-strptime-behavior` and :meth:`datetime.isoformat`.


Examples of Usage: :class:`.datetime`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Examples of working with :class:`.datetime` objects:

.. doctest::

    >>> from datetime import datetime, date, time, timezone

    >>> # Using datetime.combine()
    >>> d = date(2005, 7, 14)
    >>> t = time(12, 30)
    >>> datetime.combine(d, t)
    datetime.datetime(2005, 7, 14, 12, 30)

    >>> # Using datetime.now()
    >>> datetime.now()   # doctest: +SKIP
    datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +1
    >>> datetime.now(timezone.utc)   # doctest: +SKIP
    datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)

    >>> # Using datetime.strptime()
    >>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
    >>> dt
    datetime.datetime(2006, 11, 21, 16, 30)

    >>> # Using datetime.timetuple() to get tuple of all attributes
    >>> tt = dt.timetuple()
    >>> for it in tt:   # doctest: +SKIP
    ...     print(it)
    ...
    2006    # year
    11      # month
    21      # day
    16      # hour
    30      # minute
    0       # second
    1       # weekday (0 = Monday)
    325     # number of days since 1st January
    -1      # dst - method tzinfo.dst() returned None

    >>> # Date in ISO format
    >>> ic = dt.isocalendar()
    >>> for it in ic:   # doctest: +SKIP
    ...     print(it)
    ...
    2006    # ISO year
    47      # ISO week
    2       # ISO weekday

    >>> # Formatting a datetime
    >>> dt.strftime("%A, %d. %B %Y %I:%M%p")
    'Tuesday, 21. November 2006 04:30PM'
    >>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")
    'The day is 21, the month is November, the time is 04:30PM.'

The example below defines a :class:`tzinfo` subclass capturing time zone
information for Kabul, Afghanistan, which used +4 UTC until 1945
and then +4:30 UTC thereafter::

   from datetime import timedelta, datetime, tzinfo, timezone

   class KabulTz(tzinfo):
       # Kabul used +4 until 1945, when they moved to +4:30
       UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)

       def utcoffset(self, dt):
           if dt.year < 1945:
               return timedelta(hours=4)
           elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):
               # An ambiguous ("imaginary") half-hour range representing
               # a 'fold' in time due to the shift from +4 to +4:30.
               # If dt falls in the imaginary range, use fold to decide how
               # to resolve. See PEP495.
               return timedelta(hours=4, minutes=(30 if dt.fold else 0))
           else:
               return timedelta(hours=4, minutes=30)

       def fromutc(self, dt):
           # Follow same validations as in datetime.tzinfo
           if not isinstance(dt, datetime):
               raise TypeError("fromutc() requires a datetime argument")
           if dt.tzinfo is not self:
               raise ValueError("dt.tzinfo is not self")

           # A custom implementation is required for fromutc as
           # the input to this function is a datetime with utc values
           # but with a tzinfo set to self.
           # See datetime.astimezone or fromtimestamp.
           if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:
               return dt + timedelta(hours=4, minutes=30)
           else:
               return dt + timedelta(hours=4)

       def dst(self, dt):
           # Kabul does not observe daylight saving time.
           return timedelta(0)

       def tzname(self, dt):
           if dt >= self.UTC_MOVE_DATE:
               return "+04:30"
           return "+04"

Usage of ``KabulTz`` from above::

   >>> tz1 = KabulTz()

   >>> # Datetime before the change
   >>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
   >>> print(dt1.utcoffset())
   4:00:00

   >>> # Datetime after the change
   >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
   >>> print(dt2.utcoffset())
   4:30:00

   >>> # Convert datetime to another time zone
   >>> dt3 = dt2.astimezone(timezone.utc)
   >>> dt3
   datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
   >>> dt2
   datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
   >>> dt2 == dt3
   True

.. _datetime-time:

:class:`.time` Objects
----------------------

A :class:`.time` object represents a (local) time of day, independent of any particular
day, and subject to adjustment via a :class:`tzinfo` object.

.. class:: time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

   All arguments are optional. *tzinfo* may be ``None``, or an instance of a
   :class:`tzinfo` subclass. The remaining arguments must be integers in the
   following ranges:

   * ``0 <= hour < 24``,
   * ``0 <= minute < 60``,
   * ``0 <= second < 60``,
   * ``0 <= microsecond < 1000000``,
   * ``fold in [0, 1]``.

   If an argument outside those ranges is given, :exc:`ValueError` is raised. All
   default to 0 except *tzinfo*, which defaults to ``None``.

Class attributes:


.. attribute:: time.min

   The earliest representable :class:`.time`, ``time(0, 0, 0, 0)``.


.. attribute:: time.max

   The latest representable :class:`.time`, ``time(23, 59, 59, 999999)``.


.. attribute:: time.resolution

   The smallest possible difference between non-equal :class:`.time` objects,
   ``timedelta(microseconds=1)``, although note that arithmetic on
   :class:`.time` objects is not supported.


Instance attributes (read-only):

.. attribute:: time.hour

   In ``range(24)``.


.. attribute:: time.minute

   In ``range(60)``.


.. attribute:: time.second

   In ``range(60)``.


.. attribute:: time.microsecond

   In ``range(1000000)``.


.. attribute:: time.tzinfo

   The object passed as the tzinfo argument to the :class:`.time` constructor, or
   ``None`` if none was passed.


.. attribute:: time.fold

   In ``[0, 1]``. Used to disambiguate wall times during a repeated interval. (A
   repeated interval occurs when clocks are rolled back at the end of daylight saving
   time or when the UTC offset for the current zone is decreased for political reasons.)
   The values 0 and 1 represent, respectively, the earlier and later of the two
   moments with the same wall time representation.

   .. versionadded:: 3.6

:class:`.time` objects support equality and order comparisons,
where ``a`` is considered less than ``b`` when ``a`` precedes ``b`` in time.

Naive and aware :class:`!time` objects are never equal.
Order comparison between naive and aware :class:`!time` objects raises
:exc:`TypeError`.

If both comparands are aware, and have the same :attr:`~.time.tzinfo`
attribute, the :attr:`!tzinfo` and :attr:`!fold` attributes are
ignored and the base times are compared. If both comparands are aware and
have different :attr:`!tzinfo` attributes, the comparands are first adjusted by
subtracting their UTC offsets (obtained from ``self.utcoffset()``).

.. versionchanged:: 3.3
  Equality comparisons between aware and naive :class:`.time` instances
  don't raise :exc:`TypeError`.

In Boolean contexts, a :class:`.time` object is always considered to be true.

.. versionchanged:: 3.5
   Before Python 3.5, a :class:`.time` object was considered to be false if it
   represented midnight in UTC. This behavior was considered obscure and
   error-prone and has been removed in Python 3.5. See :issue:`13936` for full
   details.


Other constructors:

.. classmethod:: time.fromisoformat(time_string)

   Return a :class:`.time` corresponding to a *time_string* in any valid
   ISO 8601 format, with the following exceptions:

   1. Time zone offsets may have fractional seconds.
   2. The leading ``T``, normally required in cases where there may be ambiguity between
      a date and a time, is not required.
   3. Fractional seconds may have any number of digits (anything beyond 6 will
      be truncated).
   4. Fractional hours and minutes are not supported.

   Examples:

   .. doctest::

       >>> from datetime import time
       >>> time.fromisoformat('04:23:01')
       datetime.time(4, 23, 1)
       >>> time.fromisoformat('T04:23:01')
       datetime.time(4, 23, 1)
       >>> time.fromisoformat('T042301')
       datetime.time(4, 23, 1)
       >>> time.fromisoformat('04:23:01.000384')
       datetime.time(4, 23, 1, 384)
       >>> time.fromisoformat('04:23:01,000384')
       datetime.time(4, 23, 1, 384)
       >>> time.fromisoformat('04:23:01+04:00')
       datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
       >>> time.fromisoformat('04:23:01Z')
       datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
       >>> time.fromisoformat('04:23:01+00:00')
       datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)


   .. versionadded:: 3.7
   .. versionchanged:: 3.11
      Previously, this method only supported formats that could be emitted by
      :meth:`time.isoformat`.

.. classmethod:: time.strptime(date_string, format)

   Return a :class:`.time` corresponding to *date_string*, parsed according to
   *format*.

   If *format* does not contain microseconds or timezone information, this is equivalent to::

     time(*(time.strptime(date_string, format)[3:6]))

   :exc:`ValueError` is raised if the *date_string* and *format*
   cannot be parsed by :func:`time.strptime` or if it returns a value which is not a
   time tuple.  See also :ref:`strftime-strptime-behavior` and
   :meth:`time.fromisoformat`.

   .. versionadded:: 3.14


Instance methods:

.. method:: time.replace(hour=self.hour, minute=self.minute, second=self.second, \
   microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

   Return a :class:`.time` with the same value, except for those attributes given
   new values by whichever keyword arguments are specified. Note that
   ``tzinfo=None`` can be specified to create a naive :class:`.time` from an
   aware :class:`.time`, without conversion of the time data.

   :class:`.time` objects are also supported by generic function
   :func:`copy.replace`.

   .. versionchanged:: 3.6
      Added the *fold* parameter.


.. method:: time.isoformat(timespec='auto')

   Return a string representing the time in ISO 8601 format, one of:

   - ``HH:MM:SS.ffffff``, if :attr:`microsecond` is not 0
   - ``HH:MM:SS``, if :attr:`microsecond` is 0
   - ``HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``, if :meth:`utcoffset` does not return ``None``
   - ``HH:MM:SS+HH:MM[:SS[.ffffff]]``, if :attr:`microsecond` is 0 and :meth:`utcoffset` does not return ``None``

   The optional argument *timespec* specifies the number of additional
   components of the time to include (the default is ``'auto'``).
   It can be one of the following:

   - ``'auto'``: Same as ``'seconds'`` if :attr:`microsecond` is 0,
     same as ``'microseconds'`` otherwise.
   - ``'hours'``: Include the :attr:`hour` in the two-digit ``HH`` format.
   - ``'minutes'``: Include :attr:`hour` and :attr:`minute` in ``HH:MM`` format.
   - ``'seconds'``: Include :attr:`hour`, :attr:`minute`, and :attr:`second`
     in ``HH:MM:SS`` format.
   - ``'milliseconds'``: Include full time, but truncate fractional second
     part to milliseconds. ``HH:MM:SS.sss`` format.
   - ``'microseconds'``: Include full time in ``HH:MM:SS.ffffff`` format.

   .. note::

      Excluded time components are truncated, not rounded.

   :exc:`ValueError` will be raised on an invalid *timespec* argument.

   Example::

      >>> from datetime import time
      >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
      '12:34'
      >>> dt = time(hour=12, minute=34, second=56, microsecond=0)
      >>> dt.isoformat(timespec='microseconds')
      '12:34:56.000000'
      >>> dt.isoformat(timespec='auto')
      '12:34:56'

   .. versionchanged:: 3.6
      Added the *timespec* parameter.


.. method:: time.__str__()

   For a time ``t``, ``str(t)`` is equivalent to ``t.isoformat()``.


.. method:: time.strftime(format)

   Return a string representing the time, controlled by an explicit format
   string.  See also :ref:`strftime-strptime-behavior` and :meth:`time.isoformat`.


.. method:: time.__format__(format)

   Same as :meth:`.time.strftime`. This makes it possible to specify
   a format string for a :class:`.time` object in :ref:`formatted string
   literals <f-strings>` and when using :meth:`str.format`.
   See also :ref:`strftime-strptime-behavior` and :meth:`time.isoformat`.


.. method:: time.utcoffset()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.utcoffset(None)``, and raises an exception if the latter doesn't
   return ``None`` or a :class:`timedelta` object with magnitude less than one day.

   .. versionchanged:: 3.7
      The UTC offset is not restricted to a whole number of minutes.


.. method:: time.dst()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.dst(None)``, and raises an exception if the latter doesn't return
   ``None``, or a :class:`timedelta` object with magnitude less than one day.

   .. versionchanged:: 3.7
      The DST offset is not restricted to a whole number of minutes.

.. method:: time.tzname()

   If :attr:`.tzinfo` is ``None``, returns ``None``, else returns
   ``self.tzinfo.tzname(None)``, or raises an exception if the latter doesn't
   return ``None`` or a string object.

Examples of Usage: :class:`.time`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Examples of working with a :class:`.time` object::

    >>> from datetime import time, tzinfo, timedelta
    >>> class TZ1(tzinfo):
    ...     def utcoffset(self, dt):
    ...         return timedelta(hours=1)
    ...     def dst(self, dt):
    ...         return timedelta(0)
    ...     def tzname(self,dt):
    ...         return "+01:00"
    ...     def  __repr__(self):
    ...         return f"{self.__class__.__name__}()"
    ...
    >>> t = time(12, 10, 30, tzinfo=TZ1())
    >>> t
    datetime.time(12, 10, 30, tzinfo=TZ1())
    >>> t.isoformat()
    '12:10:30+01:00'
    >>> t.dst()
    datetime.timedelta(0)
    >>> t.tzname()
    '+01:00'
    >>> t.strftime("%H:%M:%S %Z")
    '12:10:30 +01:00'
    >>> 'The {} is {:%H:%M}.'.format("time", t)
    'The time is 12:10.'


.. _datetime-tzinfo:

:class:`tzinfo` Objects
-----------------------

.. class:: tzinfo()

   This is an abstract base class, meaning that this class should not be
   instantiated directly.  Define a subclass of :class:`tzinfo` to capture
   information about a particular time zone.

   An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the
   constructors for :class:`.datetime` and :class:`.time` objects. The latter objects
   view their attributes as being in local time, and the :class:`tzinfo` object
   supports methods revealing offset of local time from UTC, the name of the time
   zone, and DST offset, all relative to a date or time object passed to them.

   You need to derive a concrete subclass, and (at least)
   supply implementations of the standard :class:`tzinfo` methods needed by the
   :class:`.datetime` methods you use. The :mod:`!datetime` module provides
   :class:`timezone`, a simple concrete subclass of :class:`tzinfo` which can
   represent time zones with fixed offset from UTC such as UTC itself or North
   American EST and EDT.

   Special requirement for pickling:  A :class:`tzinfo` subclass must have an
   :meth:`~object.__init__` method that can be called with no arguments,
   otherwise it can be
   pickled but possibly not unpickled again. This is a technical requirement that
   may be relaxed in the future.

   A concrete subclass of :class:`tzinfo` may need to implement the following
   methods. Exactly which methods are needed depends on the uses made of aware
   :mod:`!datetime` objects. If in doubt, simply implement all of them.


.. method:: tzinfo.utcoffset(dt)

   Return offset of local time from UTC, as a :class:`timedelta` object that is
   positive east of UTC. If local time is west of UTC, this should be negative.

   This represents the *total* offset from UTC; for example, if a
   :class:`tzinfo` object represents both time zone and DST adjustments,
   :meth:`utcoffset` should return their sum. If the UTC offset isn't known,
   return ``None``. Else the value returned must be a :class:`timedelta` object
   strictly between ``-timedelta(hours=24)`` and ``timedelta(hours=24)``
   (the magnitude of the offset must be less than one day). Most implementations
   of :meth:`utcoffset` will probably look like one of these two::

      return CONSTANT                 # fixed-offset class
      return CONSTANT + self.dst(dt)  # daylight-aware class

   If :meth:`utcoffset` does not return ``None``, :meth:`dst` should not return
   ``None`` either.

   The default implementation of :meth:`utcoffset` raises
   :exc:`NotImplementedError`.

   .. versionchanged:: 3.7
      The UTC offset is not restricted to a whole number of minutes.


.. method:: tzinfo.dst(dt)

   Return the daylight saving time (DST) adjustment, as a :class:`timedelta`
   object or
   ``None`` if DST information isn't known.

   Return ``timedelta(0)`` if DST is not in effect.
   If DST is in effect, return the offset as a :class:`timedelta` object
   (see :meth:`utcoffset` for details). Note that DST offset, if applicable, has
   already been added to the UTC offset returned by :meth:`utcoffset`, so there's
   no need to consult :meth:`dst` unless you're interested in obtaining DST info
   separately. For example, :meth:`datetime.timetuple` calls its :attr:`~.datetime.tzinfo`
   attribute's :meth:`dst` method to determine how the :attr:`~time.struct_time.tm_isdst` flag
   should be set, and :meth:`tzinfo.fromutc` calls :meth:`dst` to account for
   DST changes when crossing time zones.

   An instance *tz* of a :class:`tzinfo` subclass that models both standard and
   daylight times must be consistent in this sense:

   ``tz.utcoffset(dt) - tz.dst(dt)``

   must return the same result for every :class:`.datetime` *dt* with ``dt.tzinfo ==
   tz``. For sane :class:`tzinfo` subclasses, this expression yields the time
   zone's "standard offset", which should not depend on the date or the time, but
   only on geographic location. The implementation of :meth:`datetime.astimezone`
   relies on this, but cannot detect violations; it's the programmer's
   responsibility to ensure it. If a :class:`tzinfo` subclass cannot guarantee
   this, it may be able to override the default implementation of
   :meth:`tzinfo.fromutc` to work correctly with :meth:`~.datetime.astimezone` regardless.

   Most implementations of :meth:`dst` will probably look like one of these two::

      def dst(self, dt):
          # a fixed-offset class:  doesn't account for DST
          return timedelta(0)

   or::

      def dst(self, dt):
          # Code to set dston and dstoff to the time zone's DST
          # transition times based on the input dt.year, and expressed
          # in standard local time.

          if dston <= dt.replace(tzinfo=None) < dstoff:
              return timedelta(hours=1)
          else:
              return timedelta(0)

   The default implementation of :meth:`dst` raises :exc:`NotImplementedError`.

   .. versionchanged:: 3.7
      The DST offset is not restricted to a whole number of minutes.


.. method:: tzinfo.tzname(dt)

   Return the time zone name corresponding to the :class:`.datetime` object *dt*, as
   a string. Nothing about string names is defined by the :mod:`!datetime` module,
   and there's no requirement that it mean anything in particular. For example,
   ``"GMT"``, ``"UTC"``, ``"-500"``, ``"-5:00"``, ``"EDT"``, ``"US/Eastern"``, ``"America/New York"`` are all
   valid replies. Return ``None`` if a string name isn't known. Note that this is
   a method rather than a fixed string primarily because some :class:`tzinfo`
   subclasses will wish to return different names depending on the specific value
   of *dt* passed, especially if the :class:`tzinfo` class is accounting for
   daylight time.

   The default implementation of :meth:`tzname` raises :exc:`NotImplementedError`.


These methods are called by a :class:`.datetime` or :class:`.time` object, in
response to their methods of the same names. A :class:`.datetime` object passes
itself as the argument, and a :class:`.time` object passes ``None`` as the
argument. A :class:`tzinfo` subclass's methods should therefore be prepared to
accept a *dt* argument of ``None``, or of class :class:`.datetime`.

When ``None`` is passed, it's up to the class designer to decide the best
response. For example, returning ``None`` is appropriate if the class wishes to
say that time objects don't participate in the :class:`tzinfo` protocols. It
may be more useful for ``utcoffset(None)`` to return the standard UTC offset, as
there is no other convention for discovering the standard offset.

When a :class:`.datetime` object is passed in response to a :class:`.datetime`
method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can
rely on this, unless user code calls :class:`tzinfo` methods directly. The
intent is that the :class:`tzinfo` methods interpret *dt* as being in local
time, and not need worry about objects in other time zones.

There is one more :class:`tzinfo` method that a subclass may wish to override:


.. method:: tzinfo.fromutc(dt)

   This is called from the default :meth:`datetime.astimezone`
   implementation. When called from that, ``dt.tzinfo`` is *self*, and *dt*'s
   date and time data are to be viewed as expressing a UTC time. The purpose
   of :meth:`fromutc` is to adjust the date and time data, returning an
   equivalent datetime in *self*'s local time.

   Most :class:`tzinfo` subclasses should be able to inherit the default
   :meth:`fromutc` implementation without problems. It's strong enough to handle
   fixed-offset time zones, and time zones accounting for both standard and
   daylight time, and the latter even if the DST transition times differ in
   different years. An example of a time zone the default :meth:`fromutc`
   implementation may not handle correctly in all cases is one where the standard
   offset (from UTC) depends on the specific date and time passed, which can happen
   for political reasons. The default implementations of :meth:`~.datetime.astimezone` and
   :meth:`fromutc` may not produce the result you want if the result is one of the
   hours straddling the moment the standard offset changes.

   Skipping code for error cases, the default :meth:`fromutc` implementation acts
   like::

      def fromutc(self, dt):
          # raise ValueError error if dt.tzinfo is not self
          dtoff = dt.utcoffset()
          dtdst = dt.dst()
          # raise ValueError if dtoff is None or dtdst is None
          delta = dtoff - dtdst  # this is self's standard offset
          if delta:
              dt += delta   # convert to standard local time
              dtdst = dt.dst()
              # raise ValueError if dtdst is None
          if dtdst:
              return dt + dtdst
          else:
              return dt

In the following :download:`tzinfo_examples.py
<../includes/tzinfo_examples.py>` file there are some examples of
:class:`tzinfo` classes:

.. literalinclude:: ../includes/tzinfo_examples.py

Note that there are unavoidable subtleties twice per year in a :class:`tzinfo`
subclass accounting for both standard and daylight time, at the DST transition
points. For concreteness, consider US Eastern (UTC -0500), where EDT begins the
minute after 1:59 (EST) on the second Sunday in March, and ends the minute after
1:59 (EDT) on the first Sunday in November::

     UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM
     EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM
     EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM

   start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM

     end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM

When DST starts (the "start" line), the local wall clock leaps from 1:59 to
3:00. A wall time of the form 2:MM doesn't really make sense on that day, so
``astimezone(Eastern)`` won't deliver a result with ``hour == 2`` on the day DST
begins. For example, at the Spring forward transition of 2016, we get::

    >>> from datetime import datetime, timezone
    >>> from tzinfo_examples import HOUR, Eastern
    >>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)
    >>> for i in range(4):
    ...     u = u0 + i*HOUR
    ...     t = u.astimezone(Eastern)
    ...     print(u.time(), 'UTC =', t.time(), t.tzname())
    ...
    05:00:00 UTC = 00:00:00 EST
    06:00:00 UTC = 01:00:00 EST
    07:00:00 UTC = 03:00:00 EDT
    08:00:00 UTC = 04:00:00 EDT


When DST ends (the "end" line), there's a potentially worse problem: there's an
hour that can't be spelled unambiguously in local wall time: the last hour of
daylight time. In Eastern, that's times of the form 5:MM UTC on the day
daylight time ends. The local wall clock leaps from 1:59 (daylight time) back
to 1:00 (standard time) again. Local times of the form 1:MM are ambiguous.
:meth:`~.datetime.astimezone` mimics the local clock's behavior by mapping two adjacent UTC
hours into the same local hour then. In the Eastern example, UTC times of the
form 5:MM and 6:MM both map to 1:MM when converted to Eastern, but earlier times
have the :attr:`~.datetime.fold` attribute set to 0 and the later times have it set to 1.
For example, at the Fall back transition of 2016, we get::

    >>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
    >>> for i in range(4):
    ...     u = u0 + i*HOUR
    ...     t = u.astimezone(Eastern)
    ...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
    ...
    04:00:00 UTC = 00:00:00 EDT 0
    05:00:00 UTC = 01:00:00 EDT 0
    06:00:00 UTC = 01:00:00 EST 1
    07:00:00 UTC = 02:00:00 EST 0

Note that the :class:`.datetime` instances that differ only by the value of the
:attr:`~.datetime.fold` attribute are considered equal in comparisons.

Applications that can't bear wall-time ambiguities should explicitly check the
value of the :attr:`~.datetime.fold` attribute or avoid using hybrid
:class:`tzinfo` subclasses; there are no ambiguities when using :class:`timezone`,
or any other fixed-offset :class:`tzinfo` subclass (such as a class representing
only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)).

.. seealso::

    :mod:`zoneinfo`
      The :mod:`!datetime` module has a basic :class:`timezone` class (for
      handling arbitrary fixed offsets from UTC) and its :attr:`timezone.utc`
      attribute (a UTC :class:`!timezone` instance).

      ``zoneinfo`` brings the *IANA time zone database* (also known as the Olson
      database) to Python, and its usage is recommended.

   `IANA time zone database <https://www.iana.org/time-zones>`_
      The Time Zone Database (often called tz, tzdata or zoneinfo) contains code
      and data that represent the history of local time for many representative
      locations around the globe. It is updated periodically to reflect changes
      made by political bodies to time zone boundaries, UTC offsets, and
      daylight-saving rules.


.. _datetime-timezone:

:class:`timezone` Objects
-------------------------

The :class:`timezone` class is a subclass of :class:`tzinfo`, each
instance of which represents a time zone defined by a fixed offset from
UTC.

Objects of this class cannot be used to represent time zone information in the
locations where different offsets are used in different days of the year or
where historical changes have been made to civil time.


.. class:: timezone(offset, name=None)

  The *offset* argument must be specified as a :class:`timedelta`
  object representing the difference between the local time and UTC. It must
  be strictly between ``-timedelta(hours=24)`` and
  ``timedelta(hours=24)``, otherwise :exc:`ValueError` is raised.

  The *name* argument is optional. If specified it must be a string that
  will be used as the value returned by the :meth:`datetime.tzname` method.

  .. versionadded:: 3.2

  .. versionchanged:: 3.7
     The UTC offset is not restricted to a whole number of minutes.


.. method:: timezone.utcoffset(dt)

  Return the fixed value specified when the :class:`timezone` instance is
  constructed.

  The *dt* argument is ignored. The return value is a :class:`timedelta`
  instance equal to the difference between the local time and UTC.

  .. versionchanged:: 3.7
     The UTC offset is not restricted to a whole number of minutes.

.. method:: timezone.tzname(dt)

  Return the fixed value specified when the :class:`timezone` instance
  is constructed.

  If *name* is not provided in the constructor, the name returned by
  ``tzname(dt)`` is generated from the value of the ``offset`` as follows. If
  *offset* is ``timedelta(0)``, the name is "UTC", otherwise it is a string in
  the format ``UTC±HH:MM``, where ± is the sign of ``offset``, HH and MM are
  two digits of ``offset.hours`` and ``offset.minutes`` respectively.

  .. versionchanged:: 3.6
     Name generated from ``offset=timedelta(0)`` is now plain ``'UTC'``, not
     ``'UTC+00:00'``.


.. method:: timezone.dst(dt)

  Always returns ``None``.

.. method:: timezone.fromutc(dt)

  Return ``dt + offset``. The *dt* argument must be an aware
  :class:`.datetime` instance, with ``tzinfo`` set to ``self``.

Class attributes:

.. attribute:: timezone.utc

   The UTC time zone, ``timezone(timedelta(0))``.


.. index::
   single: % (percent); datetime format

.. _strftime-strptime-behavior:

:meth:`~.datetime.strftime` and :meth:`~.datetime.strptime` Behavior
--------------------------------------------------------------------

:class:`date`, :class:`.datetime`, and :class:`.time` objects all support a
``strftime(format)`` method, to create a string representing the time under the
control of an explicit format string.

Conversely, the :meth:`date.strptime`, :meth:`datetime.strptime` and
:meth:`time.strptime` class methods create an object from a string
representing the time and a corresponding format string.

The table below provides a high-level comparison of :meth:`~.datetime.strftime`
versus :meth:`~.datetime.strptime`:

+----------------+--------------------------------------------------------+------------------------------------------------------------+
|                | ``strftime``                                           | ``strptime``                                               |
+================+========================================================+============================================================+
| Usage          | Convert object to a string according to a given format | Parse a string into an object given a corresponding format |
+----------------+--------------------------------------------------------+------------------------------------------------------------+
| Type of method | Instance method                                        | Class method                                               |
+----------------+--------------------------------------------------------+------------------------------------------------------------+
| Signature      | ``strftime(format)``                                   | ``strptime(date_string, format)``                          |
+----------------+--------------------------------------------------------+------------------------------------------------------------+


   .. _format-codes:

:meth:`~.datetime.strftime` and :meth:`~.datetime.strptime` Format Codes
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These methods accept format codes that can be used to parse and format dates::

   >>> datetime.strptime('31/01/22 23:59:59.999999',
   ...                   '%d/%m/%y %H:%M:%S.%f')
   datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
   >>> _.strftime('%a %d %b %Y, %I:%M%p')
   'Mon 31 Jan 2022, 11:59PM'

The following is a list of all the format codes that the 1989 C standard
requires, and these work on all platforms with a standard C implementation.

+-----------+--------------------------------+------------------------+-------+
| Directive | Meaning                        | Example                | Notes |
+===========+================================+========================+=======+
| ``%a``    | Weekday as locale's            || Sun, Mon, ..., Sat    | \(1)  |
|           | abbreviated name.              |  (en_US);              |       |
|           |                                || So, Mo, ..., Sa       |       |
|           |                                |  (de_DE)               |       |
+-----------+--------------------------------+------------------------+-------+
| ``%A``    | Weekday as locale's full name. || Sunday, Monday, ...,  | \(1)  |
|           |                                |  Saturday (en_US);     |       |
|           |                                || Sonntag, Montag, ..., |       |
|           |                                |  Samstag (de_DE)       |       |
+-----------+--------------------------------+------------------------+-------+
| ``%w``    | Weekday as a decimal number,   | 0, 1, ..., 6           |       |
|           | where 0 is Sunday and 6 is     |                        |       |
|           | Saturday.                      |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%d``    | Day of the month as a          | 01, 02, ..., 31        | \(9)  |
|           | zero-padded decimal number.    |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%b``    | Month as locale's abbreviated  || Jan, Feb, ..., Dec    | \(1)  |
|           | name.                          |  (en_US);              |       |
|           |                                || Jan, Feb, ..., Dez    |       |
|           |                                |  (de_DE)               |       |
+-----------+--------------------------------+------------------------+-------+
| ``%B``    | Month as locale's full name.   || January, February,    | \(1)  |
|           |                                |  ..., December (en_US);|       |
|           |                                || Januar, Februar, ..., |       |
|           |                                |  Dezember (de_DE)      |       |
+-----------+--------------------------------+------------------------+-------+
| ``%m``    | Month as a zero-padded         | 01, 02, ..., 12        | \(9)  |
|           | decimal number.                |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%y``    | Year without century as a      | 00, 01, ..., 99        | \(9)  |
|           | zero-padded decimal number.    |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%Y``    | Year with century as a decimal | 0001, 0002, ..., 2013, | \(2)  |
|           | number.                        | 2014, ..., 9998, 9999  |       |
+-----------+--------------------------------+------------------------+-------+
| ``%H``    | Hour (24-hour clock) as a      | 00, 01, ..., 23        | \(9)  |
|           | zero-padded decimal number.    |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%I``    | Hour (12-hour clock) as a      | 01, 02, ..., 12        | \(9)  |
|           | zero-padded decimal number.    |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%p``    | Locale's equivalent of either  || AM, PM (en_US);       | \(1), |
|           | AM or PM.                      || am, pm (de_DE)        | \(3)  |
+-----------+--------------------------------+------------------------+-------+
| ``%M``    | Minute as a zero-padded        | 00, 01, ..., 59        | \(9)  |
|           | decimal number.                |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%S``    | Second as a zero-padded        | 00, 01, ..., 59        | \(4), |
|           | decimal number.                |                        | \(9)  |
+-----------+--------------------------------+------------------------+-------+
| ``%f``    | Microsecond as a decimal       | 000000, 000001, ...,   | \(5)  |
|           | number, zero-padded to 6       | 999999                 |       |
|           | digits.                        |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%z``    | UTC offset in the form         | (empty), +0000,        | \(6)  |
|           | ``±HHMM[SS[.ffffff]]`` (empty  | -0400, +1030,          |       |
|           | string if the object is        | +063415,               |       |
|           | naive).                        | -030712.345216         |       |
+-----------+--------------------------------+------------------------+-------+
| ``%Z``    | Time zone name (empty string   | (empty), UTC, GMT      | \(6)  |
|           | if the object is naive).       |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%j``    | Day of the year as a           | 001, 002, ..., 366     | \(9)  |
|           | zero-padded decimal number.    |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%U``    | Week number of the year        | 00, 01, ..., 53        | \(7), |
|           | (Sunday as the first day of    |                        | \(9)  |
|           | the week) as a zero-padded     |                        |       |
|           | decimal number. All days in a  |                        |       |
|           | new year preceding the first   |                        |       |
|           | Sunday are considered to be in |                        |       |
|           | week 0.                        |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%W``    | Week number of the year        | 00, 01, ..., 53        | \(7), |
|           | (Monday as the first day of    |                        | \(9)  |
|           | the week) as a zero-padded     |                        |       |
|           | decimal number. All days in a  |                        |       |
|           | new year preceding the first   |                        |       |
|           | Monday are considered to be in |                        |       |
|           | week 0.                        |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%c``    | Locale's appropriate date and  || Tue Aug 16 21:30:00   | \(1)  |
|           | time representation.           |  1988 (en_US);         |       |
|           |                                || Di 16 Aug 21:30:00    |       |
|           |                                |  1988 (de_DE)          |       |
+-----------+--------------------------------+------------------------+-------+
| ``%x``    | Locale's appropriate date      || 08/16/88 (None);      | \(1)  |
|           | representation.                || 08/16/1988 (en_US);   |       |
|           |                                || 16.08.1988 (de_DE)    |       |
+-----------+--------------------------------+------------------------+-------+
| ``%X``    | Locale's appropriate time      || 21:30:00 (en_US);     | \(1)  |
|           | representation.                || 21:30:00 (de_DE)      |       |
+-----------+--------------------------------+------------------------+-------+
| ``%%``    | A literal ``'%'`` character.   | %                      |       |
+-----------+--------------------------------+------------------------+-------+

Several additional directives not required by the C89 standard are included for
convenience. These parameters all correspond to ISO 8601 date values.

+-----------+--------------------------------+------------------------+-------+
| Directive | Meaning                        | Example                | Notes |
+===========+================================+========================+=======+
| ``%G``    | ISO 8601 year with century     | 0001, 0002, ..., 2013, | \(8)  |
|           | representing the year that     | 2014, ..., 9998, 9999  |       |
|           | contains the greater part of   |                        |       |
|           | the ISO week (``%V``).         |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%u``    | ISO 8601 weekday as a decimal  | 1, 2, ..., 7           |       |
|           | number where 1 is Monday.      |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%V``    | ISO 8601 week as a decimal     | 01, 02, ..., 53        | \(8), |
|           | number with Monday as          |                        | \(9)  |
|           | the first day of the week.     |                        |       |
|           | Week 01 is the week containing |                        |       |
|           | Jan 4.                         |                        |       |
+-----------+--------------------------------+------------------------+-------+
| ``%:z``   | UTC offset in the form         | (empty), +00:00,       | \(6)  |
|           | ``±HH:MM[:SS[.ffffff]]``       | -04:00, +10:30,        |       |
|           | (empty string if the object is | +06:34:15,             |       |
|           | naive).                        | -03:07:12.345216       |       |
+-----------+--------------------------------+------------------------+-------+

These may not be available on all platforms when used with the :meth:`~.datetime.strftime`
method. The ISO 8601 year and ISO 8601 week directives are not interchangeable
with the year and week number directives above. Calling :meth:`~.datetime.strptime` with
incomplete or ambiguous ISO 8601 directives will raise a :exc:`ValueError`.

The full set of format codes supported varies across platforms, because Python
calls the platform C library's :c:func:`strftime` function, and platform
variations are common. To see the full set of format codes supported on your
platform, consult the :manpage:`strftime(3)` documentation. There are also
differences between platforms in handling of unsupported format specifiers.

.. versionadded:: 3.6
   ``%G``, ``%u`` and ``%V`` were added.

.. versionadded:: 3.12
   ``%:z`` was added.

Technical Detail
^^^^^^^^^^^^^^^^

Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's
``time.strftime(fmt, d.timetuple())`` although not all objects support a
:meth:`~date.timetuple` method.

For the :meth:`.datetime.strptime` class method, the default value is
``1900-01-01T00:00:00.000``: any components not specified in the format string
will be pulled from the default value. [#]_

Using ``datetime.strptime(date_string, format)`` is equivalent to::

  datetime(*(time.strptime(date_string, format)[0:6]))

except when the format includes sub-second components or time zone offset
information, which are supported in ``datetime.strptime`` but are discarded by
``time.strptime``.

For :class:`.time` objects, the format codes for year, month, and day should not
be used, as :class:`!time` objects have no such values. If they're used anyway,
1900 is substituted for the year, and 1 for the month and day.

For :class:`date` objects, the format codes for hours, minutes, seconds, and
microseconds should not be used, as :class:`date` objects have no such
values. If they're used anyway, 0 is substituted for them.

For the same reason, handling of format strings containing Unicode code points
that can't be represented in the charset of the current locale is also
platform-dependent. On some platforms such code points are preserved intact in
the output, while on others ``strftime`` may raise :exc:`UnicodeError` or return
an empty string instead.

Notes:

(1)
   Because the format depends on the current locale, care should be taken when
   making assumptions about the output value. Field orderings will vary (for
   example, "month/day/year" versus "day/month/year"), and the output may
   contain non-ASCII characters.

(2)
   The :meth:`~.datetime.strptime` method can parse years in the full [1, 9999] range, but
   years < 1000 must be zero-filled to 4-digit width.

   .. versionchanged:: 3.2
      In previous versions, :meth:`~.datetime.strftime` method was restricted to
      years >= 1900.

   .. versionchanged:: 3.3
      In version 3.2, :meth:`~.datetime.strftime` method was restricted to
      years >= 1000.

(3)
   When used with the :meth:`~.datetime.strptime` method, the ``%p`` directive only affects
   the output hour field if the ``%I`` directive is used to parse the hour.

(4)
   Unlike the :mod:`time` module, the :mod:`!datetime` module does not support
   leap seconds.

(5)
   When used with the :meth:`~.datetime.strptime` method, the ``%f`` directive
   accepts from one to six digits and zero pads on the right. ``%f`` is
   an extension to the set of format characters in the C standard (but
   implemented separately in datetime objects, and therefore always
   available).

(6)
   For a naive object, the ``%z``, ``%:z`` and ``%Z`` format codes are replaced
   by empty strings.

   For an aware object:

   ``%z``
      :meth:`~.datetime.utcoffset` is transformed into a string of the form
      ``±HHMM[SS[.ffffff]]``, where ``HH`` is a 2-digit string giving the number
      of UTC offset hours, ``MM`` is a 2-digit string giving the number of UTC
      offset minutes, ``SS`` is a 2-digit string giving the number of UTC offset
      seconds and ``ffffff`` is a 6-digit string giving the number of UTC
      offset microseconds. The ``ffffff`` part is omitted when the offset is a
      whole number of seconds and both the ``ffffff`` and the ``SS`` part is
      omitted when the offset is a whole number of minutes. For example, if
      :meth:`~.datetime.utcoffset` returns ``timedelta(hours=-3, minutes=-30)``, ``%z`` is
      replaced with the string ``'-0330'``.

   .. versionchanged:: 3.7
      The UTC offset is not restricted to a whole number of minutes.

   .. versionchanged:: 3.7
      When the ``%z`` directive is provided to the  :meth:`~.datetime.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'``.

   ``%:z``
      Behaves exactly as ``%z``, but has a colon separator added between
      hours, minutes and seconds.

   ``%Z``
      In :meth:`~.datetime.strftime`, ``%Z`` is replaced by an empty string if
      :meth:`~.datetime.tzname` returns ``None``; otherwise ``%Z`` is replaced by the
      returned value, which must be a string.

      :meth:`~.datetime.strptime` only accepts certain values for ``%Z``:

      1. any value in ``time.tzname`` for your machine's locale
      2. the hard-coded values ``UTC`` and ``GMT``

      So someone living in Japan may have ``JST``, ``UTC``, and ``GMT`` as
      valid values, but probably not ``EST``. It will raise ``ValueError`` for
      invalid values.

   .. versionchanged:: 3.2
      When the ``%z`` directive is provided to the :meth:`~.datetime.strptime` method, an
      aware :class:`.datetime` object will be produced. The ``tzinfo`` of the
      result will be set to a :class:`timezone` instance.

(7)
   When used with the :meth:`~.datetime.strptime` method, ``%U`` and ``%W`` are only used
   in calculations when the day of the week and the calendar year (``%Y``)
   are specified.

(8)
   Similar to ``%U`` and ``%W``, ``%V`` is only used in calculations when the
   day of the week and the ISO year (``%G``) are specified in a
   :meth:`~.datetime.strptime` format string. Also note that ``%G`` and ``%Y`` are not
   interchangeable.

(9)
   When used with the :meth:`~.datetime.strptime` method, the leading zero is optional
   for  formats ``%d``, ``%m``, ``%H``, ``%I``, ``%M``, ``%S``, ``%j``, ``%U``,
   ``%W``, and ``%V``. Format ``%y`` does require a leading zero.

(10)
   When parsing a month and day using :meth:`~.datetime.strptime`, always
   include a year in the format.  If the value you need to parse lacks a year,
   append an explicit dummy leap year.  Otherwise your code will raise an
   exception when it encounters leap day because the default year used by the
   parser is not a leap year.  Users run into this bug every four years...

   .. doctest::

      >>> month_day = "02/29"
      >>> datetime.strptime(f"{month_day};1984", "%m/%d;%Y")  # No leap year bug.
      datetime.datetime(1984, 2, 29, 0, 0)

   .. deprecated-removed:: 3.13 3.15
      :meth:`~.datetime.strptime` calls using a format string containing
      a day of month without a year now emit a
      :exc:`DeprecationWarning`. In 3.15 or later we may change this into
      an error or change the default year to a leap year. See :gh:`70647`.

.. rubric:: Footnotes

.. [#] If, that is, we ignore the effects of Relativity

.. [#] This matches the definition of the "proleptic Gregorian" calendar in
       Dershowitz and Reingold's book *Calendrical Calculations*,
       where it's the base calendar for all computations. See the book for
       algorithms for converting between proleptic Gregorian ordinals and
       many other calendar systems.

.. [#] See R. H. van Gent's `guide to the mathematics of the ISO 8601 calendar
       <https://web.archive.org/web/20220531051136/https://webspace.science.uu.nl/~gent0113/calendar/isocalendar.htm>`_
       for a good explanation.

.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since 1900 is not a leap year.
