utcnow() and utcfromtimestamp are semi-deprecated functions /because/ they do not return tz-aware datetime objects and because in all functions that require a time zone offset (like `timestamp`), naive datetimes are treated as *local* times.
If you want to use tz-aware datetime objects (which will have the correct behavior), you should simply pass a time zone to the `tz` parameter of `now()` and `fromtimestamp`, respectively, so: ``` from datetime import datetime, timezone a = datetime.now(tz=timezone.utc) b = a.timestamp() c = datetime.fromtimestamp(b, tz=timezone.utc) assert a == c ``` I will note that because of the way aware datetime comparison semantics works, `a == c` will be true no matter what `tz` object you pass to `fromtimestamp`. If I rewrite your example with equivalent commands that do /not/ use `utcnow`, you will hopefully see how it works: ``` from datetime import datetime, timezone from dateutil.tz import tzlocal a = datetime.now(tz=timezone.utc).replace(tzinfo=None) b = a.replace(tzinfo=tzlocal()).timestamp() c = datetime.fromtimestamp(b, tz=timezone.utc).replace(tzinfo=None) assert a == c ``` As you can see, in `a` you discard the time zone information associated with the datetime, and so in `b` it is implicitly taken to be "local time", shifting it by however many hours from UTC your local time is. I will answer the hashability question in a separate e-mail, but I don't see how this has much to do with hashability. P.S. Accidentally sent this to just Brock - Brock, sorry you are getting this twice. On 4/15/19 8:01 PM, Brock Mendel wrote: > This has come up in pandas.Timestamp (which subclasses datetime). The > issue is internal consistency and round-trips. Intuitively, we would > expect: > > ``` > a = datetime.utcnow() > b = a.timestamp() > c = datetime.utcfromtimestamp(b) > assert a == b > ``` > > but this fails. (Note: it works for `datetime.now()` with > `datetime.fromtimestamp()`, though that is partially because of > weird-to-me behavior of `timestamp()` for naive datetimes). > > It would succeed if utcnow and utcfromtimestamp returned tz-aware > datetime objects. Thoughts? > > > _______________________________________________ > Datetime-SIG mailing list -- [email protected] > To unsubscribe send an email to [email protected] > https://mail.python.org/mailman3/lists/datetime-sig.python.org/ > The PSF Code of Conduct applies to this mailing list: > https://www.python.org/psf/codeofconduct/
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Datetime-SIG mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/datetime-sig.python.org/ The PSF Code of Conduct applies to this mailing list: https://www.python.org/psf/codeofconduct/
