Получить системный часовой пояс в 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]