You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
does not behave as expected and returns a date in 1978, due to normalize_timestamp (util) division by 1000 :
defnormalize_timestamp(timestamp: float) ->float:
"""Normalize millisecond and microsecond timestamps into normal timestamps."""iftimestamp>MAX_TIMESTAMP:
iftimestamp<MAX_TIMESTAMP_MS:
timestamp/=1000eliftimestamp<MAX_TIMESTAMP_US:
timestamp/=1_000_000else:
raiseValueError(f"The specified timestamp {timestamp!r} is too large.")
returntimestamp
System Info
🖥 OS name and version: Debian 11
🐍 Python version: 3.9.2
🏹 Arrow version: 1.2.2
The text was updated successfully, but these errors were encountered:
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?
fromdatetimeimportdatetimeimportarrow.constantsfromarrowimportArrowif__name__=='__main__':
print(arrow.constants.MAX_TIMESTAMP) # 32503762800.0print(arrow.Arrow.max) # 9999-12-31T23:59:59.999999+00:00print(arrow.Arrow.max.timestamp()) # 253402300800.0a=Arrow.utcfromtimestamp(arrow.Arrow.max.timestamp())
print(a) # 1978-01-11T21:31:40.800000+00:00datetime.max.timestamp() # ValueError: year 10000 is out of range
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
The text was updated successfully, but these errors were encountered: