在Python中获取计算机的UTC偏移量
gmtime()
将返回UTC时间,localtime()
将返回本地时间,因此减去两者应该会给你utc偏移量。
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年期间的时间,例如,欧洲/莫斯科时间偏移/将来的日期。
这是很好,干净。 – Rockallite 2013-12-19 02:25:51
超级有用。谢谢,J.F. – 2015-03-30 03:23:13
请注意,'total_seconds()'仅在Python 3.2+中可用。 – mattst 2016-06-04 13:46:11
我喜欢:
>>> strftime('%z')
'-0700'
我第一次尝试JTS”的答案,但它给了我错误的结果。我现在在-0700,但它是说我在-0800。但是在我能够减去某些东西之前,我必须做一些转换,所以也许答案比不正确。
Python不支持''%z''(它可能适用于某些可能使用'time.localtime()。tm_gmtoff')的系统,以获取utc偏移量作为数字,而不是字符串)。 (''%z'')的结果应该与@jts的答案相同。如果您不这么想,请包括您的代码。 – jfs 2015-04-04 13:23:49
导入时间 时间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
1.不要把代码放在注释里,而是更新你的答案2.这里使用mktime()是不正确的,用'calendar.timegm()'或'datetime()'来找到差异 – jfs 2015-04-04 18:24:08
这里是一些只有日期时间和时间作为导入的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'
这个工作对我来说:
if time.daylight > 0:
return time.altzone
else:
return time.timezone
它是不正确。注意:['time.localtime()。tm_isdst> 0'在我的答案中有类似的代码](http://*.com/a/3168394/4279) – jfs 2015-09-22 22:59:18
对不起,你的文章太长了,我完成了没有理解,这是相同的答案。我的帖子肯定是相同解决方案的较短版本。 – Alecs 2015-09-23 11:30:51
不,代码是错误的。 'time.daylight'没有说明夏天是否现在。它说当地时间可能有DST。这就是为什么你必须调用'time.localtime()。tm_isdst' – jfs 2015-09-23 12:57:35
辉煌!我需要学会思考简单:) – Paul 2010-07-02 18:24:05
这里有一些优雅的简单。 – 2015-03-30 03:22:45
减去它们给'TypeError:不支持的操作数类型为 - :'time.struct_time'和'time.struct_time'。你究竟是什么意思? – rakslice 2015-05-01 21:45:00