Open JosEnerv opened 2 years ago
Hi @JosEnerv, thanks for the bug report, we've struggled a lot with max timestamp calculations in the past. Can you put together a minimal example so we can try to reproduce on our end?
Sure, this is the example :
from datetime import datetime
import arrow.constants
from arrow import Arrow
if __name__ == '__main__':
print(arrow.constants.MAX_TIMESTAMP) # 32503762800.0
print(arrow.Arrow.max) # 9999-12-31T23:59:59.999999+00:00
print(arrow.Arrow.max.timestamp()) # 253402300800.0
a = Arrow.utcfromtimestamp(arrow.Arrow.max.timestamp())
print(a) # 1978-01-11T21:31:40.800000+00:00
datetime.max.timestamp() # ValueError: year 10000 is out of range
As background info, the ticket I opened on the python bugtracker : https://bugs.python.org/issue46856
Issue Description
There are some issues related to the way max values are handled (partially because of how python's datetime works) :
The way how Arrow calculates the max timestamp constant value also fails on Linux in constants.py :
_MAX_TIMESTAMP = datetime.max.timestamp()
Which will raise a ValueError in non-utc timezones (timestamp() ) will try to return a timestamp in the local timezone):
ValueError: year 10000 is out of range
Therefore I suggest making this more robust and replacing this with :
datetime.max.replace(tzinfo=timezone.utc).timestamp()
Which is more in line with python documentation : https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp
Using
Arrow.max
has its own issues , asArrow.utcfromtimestamp(Arrow.max.float_timestamp)
does not behave as expected and returns a date in 1978, due to
normalize_timestamp
(util) division by 1000 :System Info