Skip to content
Open
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
8 changes: 4 additions & 4 deletions arrow/constants.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Constants used internally in arrow."""

import sys
from datetime import datetime
from datetime import datetime, timezone
from typing import Final

# datetime.max.timestamp() errors on Windows, so we must hardcode
Expand All @@ -11,17 +11,17 @@
try:
# Get max timestamp. Works on POSIX-based systems like Linux and macOS,
# but will trigger an OverflowError, ValueError, or OSError on Windows
_MAX_TIMESTAMP = datetime.max.timestamp()
_MAX_TIMESTAMP = datetime.max.replace(tzinfo=timezone.utc).timestamp()
except (OverflowError, ValueError, OSError): # pragma: no cover
# Fallback for Windows and 32-bit systems if initial max timestamp call fails
# Must get max value of ctime on Windows based on architecture (x32 vs x64)
# https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/ctime-ctime32-ctime64-wctime-wctime32-wctime64
# Note: this may occur on both 32-bit Linux systems (issue #930) along with Windows systems
is_64bits = sys.maxsize > 2**32
_MAX_TIMESTAMP = (
datetime(3000, 1, 1, 23, 59, 59, 999999).timestamp()
datetime(3000, 1, 1, 23, 59, 59, 999999, tzinfo=timezone.utc).timestamp()
if is_64bits
else datetime(2038, 1, 1, 23, 59, 59, 999999).timestamp()
else datetime(2038, 1, 1, 23, 59, 59, 999999, tzinfo=timezone.utc).timestamp()
)

MAX_TIMESTAMP: Final[float] = _MAX_TIMESTAMP
Expand Down
14 changes: 14 additions & 0 deletions tests/test_arrow.py
Original file line number Diff line number Diff line change
Expand Up @@ -3097,3 +3097,17 @@ def test_get_iteration_params(self):

with pytest.raises(ValueError):
arrow.Arrow._get_iteration_params(None, None)


class TestArrowConstants:
def test_max_timestamp_is_utc_based(self):
from arrow.constants import MAX_TIMESTAMP

expected = datetime.max.replace(tzinfo=timezone.utc).timestamp()
assert MAX_TIMESTAMP == expected

def test_max_timestamp_derived_constants(self):
from arrow.constants import MAX_TIMESTAMP, MAX_TIMESTAMP_MS, MAX_TIMESTAMP_US

assert MAX_TIMESTAMP_MS == MAX_TIMESTAMP * 1000
assert MAX_TIMESTAMP_US == MAX_TIMESTAMP * 1_000_000
Loading