2010-07-02 3 views

ответ

24

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

+0

Brilliant! Мне нужно научиться думать просто :) – Paul

+0

Это немного элегантная простота прямо здесь. –

+1

Вычитание их дает 'TypeError: неподдерживаемый тип операндов для -: 'time.struct_time' и 'time.struct_time''. Что вы на самом деле имели в виду? – rakslice

62

time.timezone:

import time 

print -time.timezone 

Он печатает UTC смещение в секундах (принять во внимание Переход на летнее время (DST) см time.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 attribute, если базовая библиотека C поддерживает его:

utc_offset = time.localtime().tm_gmtoff 

Примечание: time.daylight может дать неправильный результат в some edge cases.

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's suggestion в substruct местного и 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 период.

+1

Это красиво и чисто. – Rockallite

+1

Супер полезно. Спасибо, J.F. –

+0

Обратите внимание, что 'total_seconds()' доступно только в Python 3.2+. – mattst

2

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

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

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

+1

''% z'' не поддерживается Python (он может работать на некоторых системах, где скорее всего вы можете использовать 'time.localtime(). Tm_gmtoff' вместо этого, чтобы получить смещение utc как число, а не строку). Результат («% z'') должен быть идентичным с ответом @jts. Включите ваш код, если вы думаете иначе. – jfs

+0

импорта время time0 = time.time() utc_time = time.mktime (time.gmtime (time0)) LOCAL_TIME = time.mktime (time.localtime (time0)) смещение = LOCAL_TIME - utc_time печати (смещение/(60 * 60)) Дает -8. – dstromberg

+0

1. не помещайте код в комментарии, обновляйте свой ответ вместо 2. неверно использовать mktime() здесь, используйте 'calendar.timegm()' или 'datetime()', чтобы найти разницу – jfs

-1

Вот несколько кодов python3 с просто datetime и time as import. НТН

>>> 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' 
-3

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

if time.daylight > 0: 
     return time.altzone 
    else: 
     return time.timezone 
+0

это неверен. Обратите внимание: ['time.localtime(). Tm_isdst> 0' в аналогичном коде в моем ответе] (http://stackoverflow.com/a/3168394/4279) – jfs

+0

Жаль, ваше сообщение так долго и полно, что я не понял, что это тот же ответ. Мой пост - это, конечно, более короткая версия того же решения. – Alecs

+1

нет, код неправильный. 'time.daylight' не говорит, является ли сейчас летнее время. В нем говорится, что местное время может иметь DST. Вот почему вы должны называть 'time.localtime(). Tm_isdst' – jfs

Смежные вопросы