我想知道Python库pytz中timezone参数的所有可能值是什么。怎么做呢?
当前回答
不要创建自己的列表- pytz有一个内置的集合:
import pytz
set(pytz.all_timezones_set)
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}
然后你可以应用一个时区:
import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00
或者如果你已经有一个datetime对象是TZ感知的(不是天真的):
# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)
# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)
>>> new_ct.isoformat()
2017-01-13T11:29:22.601991-05:00
其他回答
下面是一个包含国家代码、名称、大洲、首都和pytz时区的Python列表:
countries = [
{'timezones': ['Europe/Paris'], 'code': 'FR', 'continent': 'Europe', 'name': 'France', 'capital': 'Paris'}
{'timezones': ['Africa/Kampala'], 'code': 'UG', 'continent': 'Africa', 'name': 'Uganda', 'capital': 'Kampala'},
{'timezones': ['Asia/Colombo'], 'code': 'LK', 'continent': 'Asia', 'name': 'Sri Lanka', 'capital': 'Sri Jayewardenepura Kotte'},
{'timezones': ['Asia/Riyadh'], 'code': 'SA', 'continent': 'Asia', 'name': 'Saudi Arabia', 'capital': 'Riyadh'},
{'timezones': ['Africa/Luanda'], 'code': 'AO', 'continent': 'Africa', 'name': 'Angola', 'capital': 'Luanda'},
{'timezones': ['Europe/Vienna'], 'code': 'AT', 'continent': 'Europe', 'name': 'Austria', 'capital': 'Vienna'},
{'timezones': ['Asia/Calcutta'], 'code': 'IN', 'continent': 'Asia', 'name': 'India', 'capital': 'New Delhi'},
{'timezones': ['Asia/Dubai'], 'code': 'AE', 'continent': 'Asia', 'name': 'United Arab Emirates', 'capital': 'Abu Dhabi'},
{'timezones': ['Europe/London'], 'code': 'GB', 'continent': 'Europe', 'name': 'United Kingdom', 'capital': 'London'},
]
要获得完整的列表,请参阅GitHub Gist。
可从Python3.9获取:
zoneinfo, Python3.9中的新模块,用于IANA数据库。 为了获取所有可用的时区,首先:
pip install tzdata
然后:
import zoneinfo
print(zoneinfo.available_timezones())
你可以在这里找到所有pytz支持的时区:
https://gist.github.com/heyalexej/8bf688fd67d7199be4a1682b3eec7568
它们似乎是由这里找到的tz数据库时区填充的。
编辑:如果你不要再对这个答案投反对票,我会很感激的。这个答案是错误的,但我宁愿保留它作为一个历史注释。虽然pytz接口是否容易出错是有争议的,但它可以做一些dateutil的事情。Tz做不到,特别是关于过去或将来的夏令时。我在一篇文章“Python中的时区”中诚实地记录了我的经验。
如果您使用的是类unix平台,我建议您避免使用pytz,只查看/usr/share/zoneinfo。dateutil。Tz可以利用那里的信息。
下面的代码段显示了pytz可能给出的问题。当我第一次发现时,我很震惊。(有趣的是,yum在CentOS 7上安装的pytz没有出现这个问题。)
import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
.total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
- datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
.total_seconds())
-29160.0
-28800.0
也就是说,pytz创建的时区是真实的本地时间,而不是人们所观察的标准本地时间。上海符合+0800,而不是pytz建议的+0806:
pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
编辑:感谢Mark Ransom的评论和反对票,现在我知道我使用pytz的方式是错误的。总之,您不应该将pytz.timezone(…)的结果传递给datetime,而应该将datetime传递给它的本地化方法。
Despite his argument (and my bad for not reading the pytz documentation more carefully), I am going to keep this answer. I was answering the question in one way (how to enumerate the supported timezones, though not with pytz), because I believed pytz did not provide a correct solution. Though my belief was wrong, this answer is still providing some information, IMHO, which is potentially useful to people interested in this question. Pytz's correct way of doing things is counter-intuitive. Heck, if the tzinfo created by pytz should not be directly used by datetime, it should be a different type. The pytz interface is simply badly designed. The link provided by Mark shows that many people, not just me, have been misled by the pytz interface.
推荐文章
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块