Get time zone information of the system in Python?
我想从Python获取我的系统的默认时区(PST)。 最好的方法是什么? 我想避免分支另一个过程。
这应该工作:
1 2
| import time
time.tzname |
time.tzname返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。
返回示例:('MST', 'MDT')
-
要进一步使用此功能,您可以使用time.tzname[time.daylight]获取当前时区的名称,以计算夏令时。
-
同样,'time.daylight'并不表示DST处于活动状态。它仅表示时区是否观察到DST。您正在寻找'time.localtime()。tm_isdst'。
-
只是为Windows用户添加时区的值是在`HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Time Zones中定义的。
-
如果本地时区过去有不同的缩写(Python使用1月,7月的值或当前(导入/ tzset()时间)值),则time.tzname可能返回错误的值。 tzlocal模块可用于获取给定日期的正确tzname。
-
有没有办法得到这个名字?像亚洲/德黑兰?
给出了像ThomasH的回答中的UTC偏移,但考虑了夏令时。
1 2 3 4
| >>> 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是正确的,我已经相应地编辑了答案。
-
为了安全起见,我认为应该反转偏移检查(altzone如果dst = 1,则为其他时区)。如果DST状态以某种方式未知,tm_isdst将-1,在这种情况下,当前代码将默认为altzone。对于不使用DST的区域,此值永远不会正确,因此timezone应该是后备。 (我不确定-1实际上是否可能从localtime输出)
-
在某些边缘情况下,所有altzone,基于时区的解决方案可能会失败
查看Python时间模块。
1 2
| from time import gmtime, strftime
print(strftime("%z", gmtime())) |
太平洋标准时间
-
我们正在查看不同的文件还是'%Z'?
-
@ SilentGhost:"%z"和'%z'在Python中完全相同。
-
是的,但大写Z和小写Z不是。
-
@SilentGhost:啊,我道歉,错过了。刚刚运行了一个新测试,%z和%Z都在Python 2.6中运行。
-
但产生不同的产量。
-
>>>从时间导入gmtime,strftime >>> print strftime('%z',gmtime())太平洋标准时间>>> print strftime('%Z',gmtime())太平洋标准时间我不同意。
-
docs.python.org/library/time.html#time.strftime也没有提及%Z格式的案例。
-
好吧,1。在我的机器上,它们产生不同的输出; 2. docs没有提到关于小写z的任何内容,因为只有大写的Z是有效的文字,小写不应该被使用。 docs.python.org/library/datetime.html#strftime-behavior这里是小写z产生的一些细节(即使在时间模块中)。
-
此外,不推荐使用%Z的docs state(docs.python.org/library/time.html#id2)。
-
还可以查看dateutil和tzlocal来帮助解决这个问题。 %z(和%Z)产生非标准的,模糊的平台相关字符串,这些字符串不是很有用。
-
在Linux上的Python 2.7中,%Z产生TZ首字母缩略词,例如。 CET,而%Z产生偏移,例如。 <5233>
-
这给了我GMT,这不是我机器上的系统时区。 import time; time.tzname解决方案给了我(EST,EDT),这对我来说是正确的。
-
这给了我错误的时区(再次,GMT)在Python 2中,但在Python 3中是正确的。
-
lh3.googleusercontent.com/…
用于计算偏移量的代码片段不正确,请参阅http://bugs.python.org/issue7229。
处理这个问题的正确方法是:
1 2 3 4 5 6 7 8 9 10
| 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提出的确切问题,但页面上有两个不正确的片段,时间错误很难追踪和修复。
-
1.如果你知道tm_isdst;您不需要检查daylight 2.在某些边缘情况下,所有基于altzone,timezone的解决方案可能会失败
我发现这很好用:
1 2
| import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname() |
对我来说,这能够区分夏令时与否。
https://stackoverflow.com/a/39079819/4549682
如果您更喜欢UTC偏移字符串:
1
| time.timezone / -(60*60) |