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
The value 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.
Timezone aware object using pytz You can also use the pytz module to create timezone-aware objects. For this, we will store the current date and time in a new variable using the datetime. now() function of datetime module and then we will add the timezone using timezone function of pytz module.
To get the current time in particular, you can use the strftime() method and pass into it the string ”%H:%M:%S” representing hours, minutes, and seconds.
A time zone offset of "+hh:mm" indicates that the date/time uses a local time zone which is "hh" hours and "mm" minutes ahead of UTC. A time zone offset of "-hh:mm" indicates that the date/time uses a local time zone which is "hh" hours and "mm" minutes behind UTC.
In the standard library, there is no cross-platform way to create aware timezones without creating your own timezone class. (Edit: Python 3.9 introduces zoneinfo
in the standard library which does provide this functionality.)
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)
Mind that datetime.today()
and 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:
datetime.now(pytz.utc)
which is a bit shorter and does the same.
Further reading/watching why to prefer UTC in many cases:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With