用Python获取系统的时区信息?
我想从Python中获取系统的默认时区(PST)。最好的方法是什么?我希望避免分叉另一个进程。查看Python模块 太平洋标准时间这应该可以:用Python获取系统的时区信息?,python,datetime,Python,Datetime,我想从Python中获取系统的默认时区(PST)。最好的方法是什么?我希望避免分叉另一个进程。查看Python模块 太平洋标准时间这应该可以: import time time.tzname time.tzname返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称 返回示例:('MST','MDT')给出了与ThomasH的答案类似的UTC偏移量,但考虑了夏令时 >>> import time >>> offset = tim
import time
time.tzname
time.tzname
返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称
返回示例:
('MST','MDT')
给出了与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是正确的,我已相应地编辑了答案。用于计算偏移量的代码段不正确,请参阅 正确的处理方法是:
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提出的确切问题,但页面上有两个错误片段,时间bug很难追踪和修复。我发现这很有效:
import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()
对我来说,这能够区分夏令时和非夏令时
更详细的参考信息:要获取对象形式的时区信息,请使用:
从dateutil导入
myTimeZone=tz.tzlocal()
此对象可用于以下的tz
参数:
从日期时间导入日期时间
从dateutil导入
LocalizedDateTime=datetime.now(tz=tz.tzlocal())
或datetime
对象的tz
参数,通过:
从日期时间导入日期时间
从dateutil导入
unlocalisedDatetime=datetime.now()
localisedDatetime=unlocalisedDatetime.astimezone(tz=tz.tzlocal())
将UTC的偏移量设置为timedelta
:
从日期时间导入日期时间,时区
now=datetime.now()
now.replace(tzinfo=timezone.utc)-now.astimezone(timezone.utc)
或者像这样(更晦涩但也有效):
datetime.now(timezone.utc).astimezone().tzinfo.utcoffset(无)
两种解决方案给出相同的结果。例如:
datetime.timedelta(秒=7200)
对于Python3.6+,这可以通过以下代码轻松实现:
导入日期时间
本地时区=datetime.datetime.utcnow().astimezone().tzinfo
打印(本地时区)
但是Python<3.6在naive datetime上调用astimezone()
是行不通的。所以我们必须用稍微不同的方式来做
对于Python3.x
导入日期时间
local_timezone=datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
打印(本地时区)
示例输出:在荷兰服务器(Python 3.6.9)上:
CEST
在孟加拉国服务器(Python 3.8.2)上:
+06
更多细节可以在这里找到。但是产生不同的输出。>>>从时间导入gmtime,strftime>>>打印strftime('%z',gmtime())太平洋标准时间>>>打印strftime('%z',gmtime())太平洋标准时间我不同意。在我的机器上,它们产生不同的输出;2.文档中没有提到任何关于小写字母z的内容,因为只有大写字母z是有效的文字,并且不应该使用小写字母。下面是小写字母z产生的一些细节(即使是在时间模块中)。也请查看,这有助于解决此问题z(和%z)生成非标准的、不明确的、依赖于平台的字符串,这些字符串不是很有用。在Linux上的Python 2.7中,
%z
生成TZ首字母缩写词,例如%CET
,而%z
生成偏移量,例如+0100
要进一步说明这一点,可以使用time.tzname[time.daylight]
获取当前时区的名称,考虑夏令时。同样,“time.daylight”并不表示DST处于活动状态。它仅指示时区是否观察到DST。您正在查找“time.localtime().tm_isdst”。仅为Windows用户添加,如果本地时区过去有不同的缩写,则时区的值在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones”中定义(Python使用1月、7月或当前(import/tzset()
time)的值)价值)tzlocal
模块可用于获取给定日期的正确tzname。是否有方法获取名称?和亚洲/德黑兰一样,为了安全起见,我认为偏移检查应该颠倒(如果dst=1,则为altzone,否则为else时区)。如果DST状态未知,tm_isdst
将为-1
,在这种情况下,当前代码将默认为altzone
。对于不使用DST的地区,此值永远都不正确,因此时区
可能应该是回退。(我不确定-1
是否确实可能从localtime
输出)1。如果您知道tm_isdst
;您不需要检查日光。这在python 2.6和3.6上都适用。还需要注意的是,偏移量以秒为单位。
import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()