我想从Python获取系统的默认时区(PST)。最好的方法是什么?我想避免分叉另一个过程。
我想从Python获取系统的默认时区(PST)。最好的方法是什么?我想避免分叉另一个过程。
Answers:
%Z
产生TZ的缩写,例如。CET
,而%z
产生偏移,例如。+0100
这应该工作:
import time
time.tzname
time.tzname
返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。
返回示例: ('MST', 'MDT')
time.tzname[time.daylight]
获取当前时区的名称,并考虑夏令时。
time.tzname
如果本地时区过去使用不同的缩写,则可能返回错误的值(Python使用1月,7月的值或当前(导入/tzset()
时间)值)。tzlocal
模块可以用于获取给定日期的正确tzname。
像ThomasH的答案一样提供UTC偏移量,但考虑到夏令时。
>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9
time.timezone
或的值time.altzone
以秒为单位(在UTC以西)(UTC以东的区域为负值)。这与我们实际想要的相反,因此* -1。
time.localtime().tm_isdst
如果当前不实行夏令时,则将为零(尽管如果某个地区最近更改了其夏令法,则可能不正确)。
编辑:marr75是正确的,我已经相应地编辑了答案。
tm_isdst
将为-1
,altzone
在这种情况下,当前代码默认为。对于不使用DST的区域,此值永远不会正确,因此timezone
应该是备用。(我不确定是否-1
确实可以从中输出localtime
)
我发现这很好用:
import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()
对我而言,这能够区分夏令时与否。
用于计算偏移量的代码段不正确,请参见http://bugs.python.org/issue7229。
解决此问题的正确方法是:
def local_time_offset(t=None):
"""Return offset of local zone from GMT, either at present or at time t."""
# python2.3 localtime() can't take None
if t is None:
t = time.time()
if time.localtime(t).tm_isdst and time.daylight:
return -time.altzone
else:
return -time.timezone
这很可能不是OP提出的确切问题,但是页面上有两个不正确的摘要,并且时间错误很容易被跟踪和修复。
要获取datetime.tzinfo
对象形式的时区信息,请使用dateutil.tz.tzlocal()
:
from dateutil import tz
myTimeZone = tz.tzlocal()
该对象可用于tz
参数datetime.datetime.now()
:
from datetime import datetime
from dateutil import tz
localisedDatetime = datetime.now(tz = tz.tzlocal())
或object的tz
参数datetime
通过datetime.datetime.astimezone()
:
from datetime import datetime
from dateutil import tz
unlocalisedDatetime = datetime.now()
localisedDatetime = unlocalisedDatetime.astimezone(tz = tz.tzlocal())
对于Python 3.6+,可以通过以下代码轻松实现:
import datetime
local_timezone = datetime.datetime.utcnow().astimezone().tzinfo
print(local_timezone)
但是对于Python <3.6 astimezone()
,天真的日期时间调用不起作用。因此,我们必须以一种稍有不同的方式进行操作。
因此,对于Python 3.x,
import datetime
local_timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
print(local_timezone)
示例输出:
在荷兰服务器上(Python 3.6.9):
CEST
在孟加拉国服务器上(Python 3.8.2):
+06
可以在此线程上找到更多详细信息。