I am trying to subtract one date value from the value of
datetime.datetime.today() to calculate how long ago something was. But it complains:
TypeError: can"t subtract offset-naive and offset-aware datetimes
datetime.datetime.today() doesn"t seem to be "timezone aware", while my other date value is. How do I get a value of
datetime.datetime.today() that is timezone aware?
Right now, it"s giving me the time in local time, which happens to be PST, i.e. UTC - 8 hours. Worst case, is there a way I can manually enter a timezone value into the
datetime object returned by
datetime.datetime.today() and set it to UTC-8?
Of course, the ideal solution would be for it to automatically know the timezone.
In the standard library, there is no cross-platform way to create aware timezones without creating your own timezone class.
On Windows, there"s
win32timezone.utcnow(), but that"s part of pywin32. I would rather suggest to use the pytz library, which has a constantly updated database of most timezones.
Working with local timezones can be very tricky (see "Further reading" links below), so you may rather want to use UTC throughout your application, especially for arithmetic operations like calculating the difference between two time points.
You can get the current date/time like so:
import pytz from datetime import datetime datetime.utcnow().replace(tzinfo=pytz.utc)
datetime.now() return the local time, not the UTC time, so applying
.replace(tzinfo=pytz.utc) to them would not be correct.
Another nice way to do it is:
which is a bit shorter and does the same.
Further reading/watching why to prefer UTC in many cases:
Get the current time, in a specific timezone:
import datetime import pytz my_date = datetime.datetime.now(pytz.timezone("US/Pacific"))
Remember to install
The standard library makes it much easier to specify UTC as the time zone:
>>> import datetime >>> datetime.datetime.now(datetime.timezone.utc) datetime.datetime(2020, 11, 27, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)
You can also get a datetime that includes the local time offset using
>>> datetime.datetime.now(datetime.timezone.utc).astimezone() datetime.datetime(2020, 11, 27, 15, 34, 34, 74823, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), "CET"))
(In Python 3.6+, you can shorten the last line to:
If you want a solution that uses only the standard library and that works in both Python 2 and Python 3, see jfs" answer.
zoneinfoto use the IANA time zone database:
In Python 3.9, you can specify particular time zones using the standard library, using
zoneinfo, like this:
>>> from zoneinfo import ZoneInfo >>> datetime.datetime.now(ZoneInfo("America/Los_Angeles")) datetime.datetime(2020, 11, 27, 6, 34, 34, 74823, tzinfo=zoneinfo.ZoneInfo(key="America/Los_Angeles"))
zoneinfo gets its database of time zones from the operating system, or from the first-party PyPI package
tzdata if available.
Learning Correct Cryptography by Example. The interconnected world of the current era has drastically changed everything, including banking, entertainment, and even statecraft. Despite difference...
Grokking Deep Learning teaches you to build deep learning neural networks from scratch! In his immersive style, deep learning expert Andrew Trask shows you the hidden science so you can uncover every ...
During 2014, 2015, and 2016, surveys show that among all software developers, those with higher wages are the data engineers, the data scientists, and the data architects. This is because there is ...
Shabbir Challawala has over 8 years of rich experience in providing solutions based on MySQL and PHP technologies. He is currently working with KNOWARTH Technologies. He has worked in various PHP-base...