New submission from Yi Luan <itachi.l...@gmail.com>:

Hello,

Apologies if this was a duplicate issue.

I guess the most concise way of saying this is that when doing:

>>> datetime.datetime.utcnow().timestamp()

on a machine whose local time isn't the UTC time, the above code will not 
return the correct timestamp.

Because datetime.datetime.timestamp() and datetime.datetime.fromtimestamp() 
will intrinsically convert the timestamp based on the local time of the running 
machine, when fed with data that are already converted to UTC, these functions 
will double convert them hence will return incorrect result.

For example:
On a machine that is in CST time:
>>> dt = datetime.datetime.utcnow()
>>> dt
datetime.datetime(2020, 3, 15, 14, 33, 10, 213664)
>>> datetime.datetime.fromtimestamp(dt.timestamp(), datetime.timezone.utc)
datetime.datetime(2020, 3, 15, 6, 33, 10, 213664)

Meanwhile, on a machine that is in UTC time:
>>> dt = datetime.datetime.utcnow()
>>> dt
datetime.datetime(2020, 3, 15, 14, 41, 2, 203275)
>>> datetime.datetime.fromtimestamp(dt.timestamp(), datetime.timezone.utc)
datetime.datetime(2020, 3, 15, 14, 41, 2, 203275)

I understand that one should probably use datetime.datetime.fromtimestamp() to 
construct time, but the output of the above code is inconsistent on machines 
that are set to different timezones. The above code explicitly asked to get the 
UTC time now and get the timestamp, then convert from a UTC timestamp to a 
datetime object. The result should be the same on the first machine but it 
didn't.

>From my point of view, timestamp() functions should not shift any datetime 
>objects since it returns an object that is naive about the tzinfo anyway. 
>Timestamp data generated by Python should be correct and code should do what 
>the programmer asked the code to do. In the above example, 
>datetime.datetime.utcnow().timestamp() should return the timestamp of now in 
>UTC time but in fact on a machine in CST time it would return the timestamp 8 
>hours before the UTC timestamp of now.

The intrinsic behavior of timestamp() functions will cause ambiguity in code, 
therefore I suggest that timestamp() functions, unless used on tz aware 
objects, should not shift any date time based on the running machine's local 
time.

----------
components: Library (Lib)
messages: 364240
nosy: Yi Luan
priority: normal
severity: normal
status: open
title: Combined behavior of datetime.datetime.timestamp() and 
datetime.datetime.utcnow() on non-UTC timezoned machines
type: behavior
versions: Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue39970>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to