在Python中获取计算机的UTC偏移量

问题描述 投票:0回答:10

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

python timezone utc
10个回答
110
投票

时间.时区:

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+ 中,如果底层 C 库支持,则有

tm_gmtoff
属性

utc_offset = time.localtime().tm_gmtoff

注意:

time.daylight
某些边缘情况中可能会给出错误的结果。

如果在 Python 3.3+ 上可用,则日期时间会自动使用

tm_gmtoff

from datetime import datetime, timedelta, timezone

d = datetime.now(timezone.utc).astimezone()
utc_offset = d.utcoffset() // timedelta(seconds=1)

要以解决

time.daylight
问题并且即使
tm_gmtoff
不可用也能工作的方式获取当前 UTC 偏移量,可以使用 @jts 的建议 来子化本地和 UTC 时间:

import time
from datetime import datetime

ts = time.time()
utc_offset = (datetime.fromtimestamp(ts) -
              datetime.utcfromtimestamp(ts)).total_seconds()

要获取过去/未来日期的 UTC 偏移量,可以使用

pytz
/
zoneinfo
时区:

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 年期间的欧洲/莫斯科时区。


34
投票

gmtime()
将返回 UTC 时间,
localtime()
将返回当地时间,因此减去两者应该得到 utc 偏移量。

来自 https://pubs.opengroup.org/onlinepubs/009695399/functions/gmtime.html

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

因此,尽管名称为

gmttime
,该函数还是返回 UTC。


6
投票

我喜欢:

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

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


3
投票

time 模块 有一个时区偏移量,以“UTC 以西秒数”的整数形式给出

import time
time.timezone

3
投票

您可以使用

datetime
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

1
投票
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60

0
投票

使用 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

输出示例

>>> timestamp('2018-05-01')
1525132800
>>> timestamp('2018-06-01')
1527811200

0
投票

这个技巧对我来说有什么用:

timezone_offset = (datetime.now(tz(DESIRED_TIMEZONE)).utcoffset().total_seconds()) / 3600

这样,我可以获得任意时区utc偏移量,而不仅仅是机器的时区(可以是时区配置错误的虚拟机)


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

-4
投票

这对我有用:

if time.daylight > 0:
        return time.altzone
    else:
        return time.timezone
© www.soinside.com 2019 - 2024. All rights reserved.