Получить системный часовой пояс в Python

Кажется странным, но я не могу найти простой способ найти местный часовой пояс, используя Pandas / pytz в Python.

Я могу сделать:

>>> pd.Timestamp('now', tz='utc').isoformat()
Out[47]: '2016-01-28T09:36:35.604000+00:00'
>>> pd.Timestamp('now').isoformat()
Out[48]: '2016-01-28T10:36:41.830000'
>>> pd.Timestamp('now').tz_localize('utc') - pd.Timestamp('now', tz='utc')
Out[49]: Timedelta('0 days 01:00:00')

Что даст мне часовой пояс, но это, вероятно, не лучший способ сделать это... Есть ли в pytz или pandas команда для получения системного часового пояса? (желательно в Python 2.7)

5 ответов

Решение

Я не думаю, что это возможно, используя pytz или же pandas, но вы всегда можете установить ht tp://labix.org/python-dateutil или tzlocal:

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

или же

from tzlocal import get_localzone
local_tz = get_localzone()

time.timezone должно сработать.

Смещение местного (не летнего) часового пояса в секундах к западу от UTC (отрицательный в большинстве стран Западной Европы, положительный в США, нулевой в Великобритании).

Деление на 3600 даст вам смещение в часах:

import time

print(time.timezone / 3600.0)

Это не требует каких-либо дополнительных библиотек Python.

Я обнаружил, что во многих случаях это работает:

from datetime import datetime

# use this extension and it adds the timezone
tznow = datetime.now().astimezone()
print(tznow.isoformat())
2020-11-05T06:56:38.514560-08:00

# It shows that it does have a valid timezone
type(d.tzinfo)
<class 'datetime.timezone'>

Мне это удобно, так как это не зависит от внешних пакетов. Кажется, работает только в Python3 (но не в Python2)

Довольно много настроек, связанных со временем на уровне ОС, покрывается time модуль

      import time

# Since Python 3.3
local_time = time.localtime()         # returns a `time.struct_time`
tzname_local = local_time.tm_zone     # 'EST'
dst = local_time.tm_isdst             # _from docs_: may be set to 1 when daylight savings time is in effect, 
                                      # and 0 when it is not. A value of -1 indicates that this is not known, 
                                      # and will usually result in the correct state being filled in.

tm_gmtoff и tm_zone атрибуты доступны на платформах с библиотекой C, поддерживающей соответствующие поля в struct tm.
см. https://docs.python.org/3/library/time.html#time.struct_time

      # At least from Python 2.7.18
local_tzname = time.tzname            # 'EST'

Кортеж из двух строк: первая - это имя локального часового пояса без перехода на летнее время, вторая - имя местного часового пояса летнего времени. Если часовой пояс DST не определен, вторую строку использовать не следует. см .: https://docs.python.org/2.7/library/time.html#time.tzname )

Еще одна уловка - использовать datetime.now().astimezone()как найдено здесь

      from datetime import datetime

local_now = datetime.now().astimezone()
local_tz = local_now.tzinfo  # datetime.timezone
local_tzname = local_tz.tzname(local_now)
print(local_tzname) 

Хотя он не использует pytz/Pandas, другие ответы тоже не подходят, поэтому я решил опубликовать то, что я использую в mac/linux:

import subprocess
timezone = subprocess.check_output("date").split(' ')[-2]
Другие вопросы по тегам