2010-07-02 66 views

回答

24

gmtime()將返回UTC時間,localtime()將返回本地時間,因此減去兩者應該會給你utc偏移量。

+0

輝煌!我需要學會思考簡單:) – Paul 2010-07-02 18:24:05

+0

這裏有一些優雅的簡單。 – 2015-03-30 03:22:45

+1

減去它們給'TypeError:不支持的操作數類型爲 - :'time.struct_time'和'time.struct_time'。你究竟是什麼意思? – rakslice 2015-05-01 21:45:00

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所使用的日期時間自動(如果可用)上的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() 

期間DST轉換它的工作原理,它適用於過去即使本地時區有不同的UTC在2010 - 2015年期間的時間,例如,歐洲/莫斯科時間偏移/將來的日期。

+1

這是很好,乾淨。 – Rockallite 2013-12-19 02:25:51

+1

超級有用。謝謝,J.F. – 2015-03-30 03:23:13

+0

請注意,'total_seconds()'僅在Python 3.2+中可用。 – mattst 2016-06-04 13:46:11

2

我喜歡:

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

我第一次嘗試JTS」的答案,但它給了我錯誤的結果。我現在在-0700,但它是說我在-0800。但是在我能夠減去某些東西之前,我必須做一些轉換,所以也許答案比不正確。

+1

Python不支持''%z''(它可能適用於某些可能使用'time.localtime()。tm_gmtoff')的系統,以獲取utc偏移量作爲數字,而不是字符串)。 (''%z'')的結果應該與@jts的答案相同。如果您不這麼想,請包括您的代碼。 – jfs 2015-04-04 13:23:49

+0

導入時間 時間0 =了time.time() UTC_TIME = time.mktime(time.gmtime(時間0)) LOCAL_TIME = time.mktime(time.localtime(時間0)) 偏移= LOCAL_TIME - UTC_TIME 打印(偏移/(60 * 60)) 給出-8。 – dstromberg 2015-04-04 18:09:40

+0

1.不要把代碼放在註釋裏,而是更新你的答案2.這裏使用mktime()是不正確的,用'calendar.timegm()'或'datetime()'來找到差異 – jfs 2015-04-04 18:24:08

-1

這裏是一些只有日期時間和時間作爲導入的python3代碼。 HTH

>>> 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 2015-09-22 22:59:18

+0

對不起,你的文章太長了,我完成了沒有理解,這是相同的答案。我的帖子肯定是相同解決方案的較短版本。 – Alecs 2015-09-23 11:30:51

+1

不,代碼是錯誤的。 'time.daylight'沒有說明夏天是否現在。它說當地時間可能有DST。這就是爲什麼你必須調用'time.localtime()。tm_isdst' – jfs 2015-09-23 12:57:35