获取计算机&x27;Python中的UTC偏移量

获取计算机&x27;Python中的UTC偏移量,python,timezone,utc,Python,Timezone,Utc,在Python中,如何找到计算机设置的UTC时间偏移量 gmtime()将返回UTC时间,localtime()将返回本地时间,因此减去这两个时间将得到UTC偏移量 从 gmtime()函数应将计时器指向的历元后的时间(以秒为单位)转换为细分时间,表示为协调世界时(UTC) 因此,尽管名称为gmttime,函数仍返回UTC。: 它以秒为单位打印UTC偏移量(要考虑夏令时(DST),请参见: 其中utc偏移通过以下方式定义:“若要获取本地时间,请将utc偏移添加到utc时间。” 在Python 3

在Python中,如何找到计算机设置的UTC时间偏移量

gmtime()
将返回UTC时间,
localtime()
将返回本地时间,因此减去这两个时间将得到UTC偏移量

gmtime()函数应将计时器指向的历元后的时间(以秒为单位)转换为细分时间,表示为协调世界时(UTC)

因此,尽管名称为
gmttime
,函数仍返回UTC。

它以秒为单位打印UTC偏移量(要考虑夏令时(DST),请参见:

其中utc偏移通过以下方式定义:“若要获取本地时间,请将utc偏移添加到utc时间。”

在Python 3.3+中,如果底层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偏移量,并且即使
tm\gmtoff
不可用,也能获得当前UTC偏移量,可以使用以下方法对本地时间和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年期间的欧洲/莫斯科时区。

我喜欢:

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

我先尝试了JTS的答案,但结果是错误的。我现在在-0700,但它说我在-0800。但是我必须先做一些转换,然后才能得到可以减去的东西,所以答案可能比不正确的更不完整。

这里有一些python3代码,只有datetime和time作为导入。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
创建具有UTC更正时区的Unix时间戳 这个简单的函数可以让您轻松地从MySQL/PostgreSQL数据库
date
对象获取当前时间

def timestamp(date='2018-05-01'):
    return int(time.mktime(
        datetime.datetime.strptime( date, "%Y-%m-%d" ).timetuple()
    )) + int(time.strftime('%z')) * 6 * 6
示例输出 有一个时区偏移量,以“UTC以西秒”为单位以整数表示


您可以使用
datetime
dateutil
库获取偏移量作为对象:


这很好,很干净。非常有用。谢谢,J.F。请注意,
total_seconds()
仅在Python 3.2+中可用。@mattst
total_seconds()
在Python 2.7和@raylou中可用,具体取决于您的意思。这里有一个
“%z”
不受Python支持(它可能适用于某些系统,在这些系统中,您可能会使用
time.localtime().tmgmtoff
,以数字而不是字符串的形式获取utc偏移量)。结果(在
'%z'
)应该与@jts'答案相同。如果您不这样认为,请包含您的代码。导入时间time0=time.time()utc_time=time.mktime(time.gmtime(time0))local_time=time.mktime(time.localtime(time0))offset=local_time-utc_time print(offset/(60*60))给出-8.1.不要将代码放在注释中,而是更新您的答案2.在这里使用mktime()是不正确的,请使用
calendar.timegm()
datetime()
若要查找差异,对它们进行子跟踪将给出
类型错误:不支持的操作数类型-:“time.struct\u time”和“time.struct\u time”
。您真正的意思是什么?Rakslicit,尝试calendar.timegm(time.gmtime())-calendar.timegm(time.localtime())@JasonTyler:为了避免种族冲突:@Kirby:。有些情况下GMT!=UTC,但事实并非如此。我想命名很难。谢谢你的澄清。这是错误的。注意:对不起,你的帖子太长太完整了,我不明白这是同一个答案。我的帖子肯定是同一解决方案的较短版本。不,代码是错误的。
time.daylight
没有说明夏令时是否现在。它说当地时间可能有DST。这就是为什么你必须调用
time.localtime().tm_isdst
GMT!=UTC.GMT有夏令时。UTC没有。实际上GMT与UTC相同。在英国,我们有英国夏令时(BST)有关夏令时。例如,请参见其中的“GMT(夏令时从不适用)”字样。
if time.daylight > 0:
        return time.altzone
    else:
        return time.timezone
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
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60
import time
time.timezone
>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>>
>>> # From a datetime object
>>> current_time = datetime.now(tzlocal())
>>> current_time.utcoffset()
datetime.timedelta(seconds=7200)
>>> current_time.dst()
datetime.timedelta(seconds=3600)
>>>
>>> # From a tzlocal object
>>> time_zone = tzlocal()
>>> time_zone.utcoffset(datetime.now())
datetime.timedelta(seconds=7200)
>>> time_zone.dst(datetime.now())
datetime.timedelta(seconds=3600)
>>>
>>> print('Your UTC offset is {:+g}'.format(current_time.utcoffset().total_seconds()/3600))
Your UTC offset is +2