Skip to content

bpo-43869: Time Epoch is the same on all platforms #30664

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 11 additions & 17 deletions Doc/library/time.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ An explanation of some terminology and conventions is in order.

.. index:: single: epoch

* The :dfn:`epoch` is the point where the time starts, and is platform
dependent. For Unix and Windows, the epoch is January 1, 1970, 00:00:00 (UTC).
To find out what the epoch is on a given platform, look at
``time.gmtime(0)``.
* The :dfn:`epoch` is the point where the time starts, the return value of
``time.gmtime(0)``. It is January 1, 1970, 00:00:00 (UTC) on all platforms.

.. _leap seconds: https://en.wikipedia.org/wiki/Leap_second

Expand All @@ -37,7 +35,7 @@ An explanation of some terminology and conventions is in order.

.. index:: single: Year 2038

* The functions in this module may not handle dates and times before the epoch or
* The functions in this module may not handle dates and times before the epoch_ or
far in the future. The cut-off point in the future is determined by the C
library; for 32-bit systems, it is typically in 2038.

Expand Down Expand Up @@ -207,7 +205,7 @@ Functions

.. function:: ctime([secs])

Convert a time expressed in seconds since the epoch to a string of a form:
Convert a time expressed in seconds since the epoch_ to a string of a form:
``'Sun Jun 20 23:21:05 1993'`` representing local time. The day field
is two characters long and is space padded if the day is a single digit,
e.g.: ``'Wed Jun 9 04:26:40 1993'``.
Expand Down Expand Up @@ -245,7 +243,7 @@ Functions

.. function:: gmtime([secs])

Convert a time expressed in seconds since the epoch to a :class:`struct_time` in
Convert a time expressed in seconds since the epoch_ to a :class:`struct_time` in
UTC in which the dst flag is always zero. If *secs* is not provided or
:const:`None`, the current time as returned by :func:`.time` is used. Fractions
of a second are ignored. See above for a description of the
Expand Down Expand Up @@ -601,14 +599,10 @@ Functions
.. function:: time() -> float

Return the time in seconds since the epoch_ as a floating point
number. The specific date of the epoch and the handling of
`leap seconds`_ is platform dependent.
On Windows and most Unix systems, the epoch is January 1, 1970,
00:00:00 (UTC) and leap seconds are not counted towards the time
in seconds since the epoch. This is commonly referred to as
`Unix time <https://en.wikipedia.org/wiki/Unix_time>`_.
To find out what the epoch is on a given platform, look at
``gmtime(0)``.
number. The handling of `leap seconds`_ is platform dependent.
On Windows and most Unix systems, the leap seconds are not counted towards
the time in seconds since the epoch_. This is commonly referred to as `Unix
time <https://en.wikipedia.org/wiki/Unix_time>`_.

Note that even though the time is always returned as a floating point
number, not all systems provide time with a better precision than 1 second.
Expand All @@ -629,8 +623,8 @@ Functions

.. function:: time_ns() -> int

Similar to :func:`~time.time` but returns time as an integer number of nanoseconds
since the epoch_.
Similar to :func:`~time.time` but returns time as an integer number of
nanoseconds since the epoch_.

.. versionadded:: 3.7

Expand Down
7 changes: 7 additions & 0 deletions Lib/test/test_time.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,13 @@ def test_sleep(self):
self.assertRaises(ValueError, time.sleep, -1)
time.sleep(1.2)

def test_epoch(self):
# bpo-43869: Make sure that Python use the same Epoch on all platforms:
# January 1, 1970, 00:00:00 (UTC).
epoch = time.gmtime(0)
# Only test the date and time, ignore other gmtime() members
Copy link
Member Author

@vstinner vstinner Jan 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could test more members, but I don't think that it is worth it. It can make the test more fragile if the exact value changes depending on the platform.

self.assertEqual(tuple(epoch)[:6], (1970, 1, 1, 0, 0, 0), epoch)

def test_strftime(self):
tt = time.gmtime(self.t)
for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Python uses the same time Epoch on all platforms. Add an explicit unit test
to ensure that it's the case. Patch by Victor Stinner.