В Python, как узнать, какое смещение времени UTC установлено для компьютера?

63
Paul 2 Июл 2010 в 22:09

7 ответов

Лучший ответ

gmtime() вернет время UTC, а localtime() вернет местное время, поэтому вычитание этих двух значений даст вам смещение utc.

29
jts 2 Июл 2010 в 18:15

time.timezone:

import time

print -time.timezone

Он печатает смещение UTC в секундах (для учета летнего времени (DST) см. время .altzone :

is_dst = time.daylight and time.localtime().tm_isdst > 0
utc_offset = - (time.altzone if is_dst else time.timezone)

Где смещение utc определяется через: «Чтобы получить местное время, добавьте смещение utc к времени utc».

В Python 3.3+ есть tm_gmtoff атрибут if Базовая библиотека C поддерживает это:

utc_offset = time.localtime().tm_gmtoff

Примечание. time.daylight может дать неправильный результат в некоторых крайних случаях.

tm_gmtoff автоматически используется datetime, если он доступен в Python 3.3+:

from datetime import datetime, timedelta, timezone

d = datetime.now(timezone.utc).astimezone()
utc_offset = d.utcoffset() // timedelta(seconds=1)

Чтобы получить текущее смещение UTC таким образом, чтобы обойти проблему time.daylight и это работает, даже если tm_gmtoff недоступен, @ jts предложение о создании местного и UTC времени можно использовать:

import time
from datetime import datetime

ts = time.time()
utc_offset = (datetime.fromtimestamp(ts) -
              datetime.utcfromtimestamp(ts)).total_seconds()

Чтобы получить смещение UTC для прошлых / будущих дат, можно использовать pytz часовые пояса:

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

tz = get_localzone() # local timezone 
d = datetime.now(tz) # or some other local date 
utc_offset = d.utcoffset().total_seconds()

Он работает во время переходов на летнее время, он работает для прошлых / будущих дат, даже если местный часовой пояс имел различное смещение UTC во время, например, часовой пояс Европа / Москва в период 2010-2015 годов.

83
Community 23 Май 2017 в 11:47

Мне нравится:

>>> strftime('%z')
'-0700'

Сначала я попробовал ответ JTS, но он дал неверный результат. Я сейчас в -0700, но там говорилось, что я в -0800. Но мне нужно было сделать какое-то преобразование, прежде чем я мог получить что-то, что мог вычесть, поэтому, возможно, ответ был скорее неполным, чем неправильным.

3
dstromberg 3 Апр 2015 в 23:30

Это работает для меня:

if time.daylight > 0:
        return time.altzone
    else:
        return time.timezone
-4
Alecs 22 Сен 2015 в 09:38

Вот некоторый код на python3 с указанием даты и времени в качестве импорта. НТН

>>> from datetime import datetime
>>> import time
>>> def date2iso(thedate):
...     strdate = thedate.strftime("%Y-%m-%dT%H:%M:%S")
...     minute = (time.localtime().tm_gmtoff / 60) % 60
...     hour = ((time.localtime().tm_gmtoff / 60) - minute) / 60
...     utcoffset = "%.2d%.2d" %(hour, minute)
...     if utcoffset[0] != '-':
...         utcoffset = '+' + utcoffset
...     return strdate + utcoffset
... 
>>> date2iso(datetime.fromtimestamp(time.time()))
'2015-04-06T23:56:30-0400'
-1
toppk 7 Апр 2015 в 04:00

Создание метки времени Unix с часовым поясом с коррекцией UTC

Эта простая функция поможет вам получить текущее время из объекта date базы данных MySQL / PostgreSQL.

def timestamp(date='2018-05-01'):
    return int(time.mktime(
        datetime.datetime.strptime( date, "%Y-%m-%d" ).timetuple()
    )) + int(time.strftime('%z')) * 6 * 6

Пример вывода

>>> timestamp('2018-05-01')
1525132800
>>> timestamp('2018-06-01')
1527811200
1
Stephen Blum 29 Июн 2018 в 17:42
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60
1
Tilek 20 Дек 2018 в 00:18