Get time zone information of the system in Python?

Viewed 130516

I want to get the default timezone (PST) of my system from Python. What's the best way to do that? I'd like to avoid forking another process.

8 Answers

This should work:

import time
time.tzname

time.tzname returns a tuple of two strings: The first is the name of the local non-DST timezone, the second is the name of the local DST timezone.

Example return: ('MST', 'MDT')

I found this to work well:

import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()

For me this was able to differentiate between daylight savings and not.

From Python 3.6 you can do:

tz_string = datetime.datetime.now().astimezone().tzname()

Or

tz_string = datetime.datetime.now().astimezone().tzinfo

Reference with more detail: https://stackoverflow.com/a/39079819/4549682

Check out the Python Time Module.

from time import gmtime, strftime
print(strftime("%z", gmtime()))

Pacific Standard Time

For Python 3.6+ this can be easily achieved by following code:

import datetime
local_timezone = datetime.datetime.utcnow().astimezone().tzinfo

print(local_timezone)

But with Python < 3.6 calling astimezone() on naive datetime doesn't work. So we've to do it in a slightly different way.

So for Python 3.x,

import datetime
local_timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo

print(local_timezone)

Sample Output:
On Netherlands Server(Python 3.6.9): CEST
On Bangladesh Server(Python 3.8.2): +06

More details can be found on this thread.

To obtain timezone information in the form of a datetime.tzinfo object, use dateutil.tz.tzlocal():

from dateutil import tz
myTimeZone = tz.tzlocal()

This object can be used in the tz parameter of datetime.datetime.now():

from datetime import datetime
from dateutil import tz
localisedDatetime = datetime.now(tz = tz.tzlocal())

or the tz parameter of datetime object via datetime.datetime.astimezone():

from datetime import datetime
from dateutil import tz
unlocalisedDatetime = datetime.now()
localisedDatetime = unlocalisedDatetime.astimezone(tz = tz.tzlocal())

Getting offset from UTC as timedelta:

from datetime import datetime, timezone

now = datetime.now()
now.replace(tzinfo=timezone.utc) - now.astimezone(timezone.utc)

Or like this (more obscure but also works):

datetime.now(timezone.utc).astimezone().tzinfo.utcoffset(None)

Both solutions give the same result. For example: datetime.timedelta(seconds=7200)

Related