关于时区:在Python中获取计算机的UTC偏移量

Getting computer's UTC offset in Python

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


时区:

1
2
3
import time

print -time.timezone

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

1
2
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属性:

1
utc_offset = time.localtime().tm_gmtoff

注:time.daylight可能在某些边缘情况下给出错误的结果。

如果在python 3.3+上可用,datetime将自动使用tm_gmtoff

1
2
3
4
from datetime import datetime, timedelta, timezone

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

要以解决time.daylight问题的方式获得当前的UTC偏移量,即使tm_gmtoff不可用,也可以使用@jts建议的子结构本地和UTC时间:

1
2
3
4
5
6
import time
from datetime import datetime

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

要获得过去/未来日期的UTC偏移量,可以使用pytz时区:

1
2
3
4
5
6
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转换期间工作,在过去/未来日期工作,即使本地时区在2010-2015年期间有不同的UTC时差,例如欧洲/莫斯科时区。


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


我喜欢:

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

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


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

使用更正了UTC的时区创建Unix时间戳

这个简单的函数将使您很容易从mysql/postgresql数据库date对象中获取当前时间。

1
2
3
4
def timestamp(date='2018-05-01'):
    return int(time.mktime(
        datetime.datetime.strptime( date,"%Y-%m-%d" ).timetuple()
    )) + int(time.strftime('%z')) * 6 * 6

实例输出

1
2
3
4
>>> timestamp('2018-05-01')
1525132800
>>> timestamp('2018-06-01')
1527811200

下面是一些python3代码,其中只有日期时间和时间作为导入。高温高压

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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'


这对我很有用:

1
2
3
4
if time.daylight > 0:
        return time.altzone
    else:
        return time.timezone