как получить объект tz_info, соответствующий текущему часовому поясу?

Есть ли в python (или pytz) кроссплатформенная функция, которая возвращает объект tzinfo, соответствующий часовому поясу, установленному в данный момент на компьютере?

на переменные среды нельзя рассчитывать, поскольку они не являются кроссплатформенными


person random guy    schedule 05.11.2009    source источник


Ответы (8)


tzlocal module, который возвращает pytz часовые пояса, работает в * nix и win32:

from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal

# get local timezone    
local_tz = get_localzone() 


print local_tz.localize(datetime(2012, 1, 15))
# -> 2012-01-15 00:00:00+04:00 # current utc offset
print local_tz.localize(datetime(2000, 1, 15))
# -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04)
print local_tz.localize(datetime(2000, 6, 15))
# -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST

Примечание: он принимает во внимание изменения смещения utc как для перехода на летнее время, так и не для перехода на летнее время.

person jfs    schedule 02.09.2013

Следующий фрагмент кода возвращает время в другом часовом поясе независимо от часового пояса, настроенного на сервере.

# pip install pytz tzlocal

from tzlocal import get_localzone
from datetime import datetime
from pytz import timezone

local_tz = get_localzone()
local_datetime = datetime.now(local_tz)

zurich_tz = timezone('Europe/Zurich')
zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz))
person Sandeep    schedule 18.05.2015
comment
есть ли причина не использовать здесь zurich_datetime = datetime.now(timezone('Europe/Zurich'))? кстати, необязательно звонить .normalize() после .astimezone() - person jfs; 02.05.2016
comment
как получить "Европа / Цюрих" программно? У меня много машин, и я не знаю, какая у них струна - person JDPeckham; 02.03.2020

Python 3.7:

import datetime

datetime.datetime.now().astimezone().tzinfo
person user1338062    schedule 09.08.2020

time.timezone возвращает смещение текущего часового пояса. есть также datetime.tzinfo, если вам нужна более сложная структура.

person SilentGhost    schedule 05.11.2009
comment
time.timezone () просто возвращает смещение от UTC. я хочу объект tzinfo. так что я, вероятно, хотел бы, что функция: 1. определить класс, соответствующий объекту tzinfo 2. создать экземпляр объекта 3. вернуть его - person random guy; 05.11.2009
comment
datetime в документах есть пример, объясняющий использование tzinfo. - person SilentGhost; 05.11.2009
comment
datetime.datetime.now() + datetime.timedelta(seconds=time.timezone) отлично справился со своей задачей. - person Baczek; 12.02.2013
comment
@Baczek: time.timezone не учитывает летнее время. - person jfs; 02.09.2013

Я сам не использовал его, но dateutil.tz.tzlocal () должен помочь.

http://labix.org/python-dateutil#head-50221b5226c3ccb97daa06ea7d9abf0533ec0310

person Jesper Saron    schedule 05.11.2009
comment
tzlocal() может завершиться ошибкой для дат из прошлого, например, 'Europe/Moscow' часовой пояс имел другое смещение utc до 2011 года (dateutil не работает, но pytz работает для таких часовых поясов) - person jfs; 02.09.2013

Может попробовать:

import time

print time.tzname #or time.tzname[time.daylight]

person Rain Lee    schedule 22.08.2013
comment
Сравните это с первым ответом, почему -1? - person Rain Lee; 29.08.2013
comment
[time.daylight] указывает, есть ли в текущем часовом поясе летнее время. Он не указывает, действует ли в данный момент летнее время. Также time.tzname не является экземпляром tzinfo (это строка). См. Как получить настройку системного часового пояса и передать ее в pytz.timezone?, чтобы понять, что даже если вы получите правильное tzname ; это не означает, что вы найдете местный часовой пояс. См. Получение смещения utc компьютера в Python, где демонстрируются несколько подходов для получения текущего смещения utc. - person jfs; 22.12.2014

Я спрашивал себя о том же и нашел ответ в [1]:

Взгляните на раздел 8.1.7: формат "% z" (нижний регистр, верхний регистр Z также возвращает часовой пояс, но не в 4-значном формате, а в виде сокращений часовых поясов, как в [3]) of strftime возвращает форму "+/- 4DIGIT", которая является стандартной для заголовков сообщений электронной почты (см. раздел 3.3 RFC 2822, см. [2], который отменяет другие способы указания часового пояса для заголовков сообщений электронной почты).

Итак, если вы хотите, чтобы ваш часовой пояс был в этом формате, используйте:

time.strftime("%z")

[1] http://docs.python.org/2/library/datetime.html < / а>

[2] http://tools.ietf.org/html/rfc2822#section-3.3 < / а>

[3] Сокращения часовых поясов: только http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations, только для справки.

person David L    schedule 09.12.2013
comment
Он не дает tzinfo объект. Вы можете получить текущее смещение utc для местного часового пояса как количество секунд: -altzone if daylight and localtime().tm_isdst > 0 else -timezone (все имена взяты из модуля time). - person jfs; 11.12.2013

person    schedule
comment
pytz docs говорят, что pytz.reference следует использовать только для тестов . - person jfs; 02.09.2013
comment
Это предупреждение относится к reference.USTimeZone, который использует правила перехода на летнее время в США до 2007 года. Однако reference.LocalTimezone, используемый здесь, исследует поведение time.localtime, правильность которого поддерживается системными библиотеками. reference.LocalTimezone дает правильные переходы на летнее время как до, так и после изменения правил США в 2007 году; Я не тестировал для других стран. - person rob; 03.11.2014
comment
@rob: неправильно. Не используйте LocalTimezone(). pytz предоставляет исторические данные о часовом поясе, а time.timezone, time.altzone (используемые LocalTimezone()) являются константами, т.е. в лучшем случае они отражают самое последнее определение часового пояса. Местный часовой пояс может иметь разные смещения utc в прошлом / будущем, например, попробуйте часовой пояс Европы / Москвы в 2010-2015 годах и посмотрите, что произойдет самостоятельно. - person jfs; 22.12.2014
comment
@ J.F.Sebastian Насколько я понимаю, это повлияет только на обработку исторических времен или арифметику. Для моих целей мне нужно только знать смещение локальной системы от UTC, чтобы анализировать будущие временные метки из системы (например, системные журналы), а затем сразу же конвертировать в UTC. Будет ли безопасно использовать для этого LocalTimezone()? - person notbad.jpeg; 23.01.2016
comment
@ notbad.jpeg нет. Будущее смещение UTC также может измениться. - person jfs; 23.01.2016
comment
pytz присутствует в моей системе, но отсутствует pytz.reference (Python 2.7.5 в Mac OSX 10.6) - person Jason S; 02.04.2016