在Python中,如何找到计算机设置的UTC时间偏移量?
import time
print -time.timezone
它打印出UTC偏移量(为考虑夏令时,请参见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+中,如果基础C库支持,则存在tm_gmtoff
属性:
utc_offset = time.localtime().tm_gmtoff
time.daylight
可能会给出错误的结果。tm_gmtoff
将自动被datetime使用: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()
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()
gmtime()
函数将返回UTC时间,而localtime()
函数将返回本地时间,因此两者相减应该给出UTC偏移量。
引自https://pubs.opengroup.org/onlinepubs/009695399/functions/gmtime.html
gmtime()
函数应将指向计时器指定的自纪元以来的秒数的时间转换为分解时间,表示为协调世界时(UTC)。
因此,尽管名称为gmtime()
,该函数返回UTC时间。
TypeError:不支持的操作数类型:'-:'time.struct_time'和'time.struct_time'。您实际上想表达什么?
- rakslicet = localtime(); timegm(t) - timegm(gmtime(mktime(t)))
。请注意,这个方法不改变原始含义,只是更易于理解。 - jfs我喜欢:
>>> strftime('%z')
'-0700'
我先尝试了JTS的答案,但是结果是错误的。现在我处于-0700时区,但是它告诉我我在-0800时区。不过在做减法之前,我必须进行一些转换,所以也许这个答案比错误更加不完整。
'%z'
在 Python 中不被支持(在某些系统上可能有效,您可以使用 time.localtime().tm_gmtoff
代替,以获取 UTC 偏移量作为数字而不是字符串)。结果('%z'
)应与 @jts 的答案相同。如果您有不同的看法,请包含您的代码。 - jfscalendar.timegm()
或datetime()
来找到差异。int(datetime.now().astimezone().strftime("%z")[0:3])
- storenthdatetime
和dateutil
库将偏移量作为timedelta
对象获取:>>> 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
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60
这个简单的函数将使您轻松地从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
>>> timestamp('2018-05-01')
1525132800
>>> timestamp('2018-06-01')
1527811200
timezone_offset = (datetime.now(tz(DESIRED_TIMEZONE)).utcoffset().total_seconds()) / 3600
这里是一些Python3代码,只导入了datetime和time模块。希望对你有所帮助。
>>> 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
]是不正确的。 - jfstime.daylight
并不表示当前是否处于夏令时。它只表示当地时间可能有夏令时调整。这就是为什么你需要调用time.localtime().tm_isdst
的原因。 - jfs
total_seconds()
函数可在 Python 2.7 中使用,而且可以在之前的 Python 版本中轻松模拟它。 - jfsutc2local(...)
和local2utc(...)
。很高兴@jfs来拯救!点赞! - RayLuo