Python datetime.now() with timezone

43.8k views Asked by At

I have a timezone which is float (for example 4.0).
I want to construct datetime with given timezone.

I tried this,

datetime.now(timezone)

but it throws

TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'float'

So I wonder how can I make tzinfo from float?

5

There are 5 answers

5
Martijn Pieters On BEST ANSWER

If you are using Python 3.2 or newer, you need to create a datetime.timezone() object; it takes an offset as a datetime.timedelta():

from datetime import datetime, timezone, timedelta

timezone_offset = -8.0  # Pacific Standard Time (UTC−08:00)
tzinfo = timezone(timedelta(hours=timezone_offset))
datetime.now(tzinfo)

For earlier Python versions, it'll be easiest to use an external library to define a timezone object for you.

The dateutil library includes objects to take a numerical offset to create a timezone object:

from dateutil.tz import tzoffset

timezone_offset = -8.0  # Pacific Standard Time (UTC−08:00)
tzinfo = tzoffset(None, timezone_offset * 3600)  # offset in seconds
datetime.now(tzinfo)
1
teoreda On

I suggest you to use pytz, as it could be simpler.

According to the description:

This library allows accurate and cross platform timezone calculations using Python 2.4 or higher. It also solves the issue of ambiguous times at the end of daylight saving time, which you can read more about in the Python Library Reference

>>> from datetime import datetime
>>> import pytz

>>> datetime.now(tz=pytz.UTC)
datetime.datetime(2021, 11, 12, 20, 59, 54, 579812, tzinfo=<UTC>)

>>> datetime.now(tz=pytz.timezone("Europe/Oslo"))
datetime.datetime(2021, 11, 12, 22, 0, 4, 911480, tzinfo=<DstTzInfo 'Europe/Oslo' CET+1:00:00 STD>)

>>> [tz for tz in pytz.common_timezones if tz.startswith("US")]
['US/Alaska',
 'US/Arizona',
 'US/Central',
 'US/Eastern',
 'US/Hawaii',
 'US/Mountain',
 'US/Pacific']
 

0
Yuri On

Python 3.9 brought the IANA tz database support (pytz-like) as zoneinfo.

It's advisable using the IANA names instead of static UTC offsets due daylight saving time.

0
Ash Nazg On

One-liner using zoneinfo standard library of Python 3.9:

>>> from zoneinfo import ZoneInfo
>>> datetime.now(ZoneInfo('US/Pacific'))
datetime.datetime(2022, 8, 15, 21, 59, 10, 422603, tzinfo=zoneinfo.ZoneInfo(key='US/Pacific'))
2
Hans Bouwmeester On

From Python 3.6 onwards you can use the astimezone method on a datetime object to get a timezone-aware datetime object based on the user's locale:

>>> from datetime import datetime

>>> datetime.now().astimezone().isoformat()
'2023-05-25T17:52:38.524753-07:00'