本地时区tzinfo对象
项目描述
API变更!
从tzlocal 3.0版本开始,tzlocal不再返回pytz对象,而是返回zoneinfo对象,其API不同。从4.0版本开始,它通过Paul Ganssle的pytz_deprecation_shim为pytz用户恢复了部分兼容性。
tzlocal 4.0还添加了一个官方函数get_localzone_name(),用于仅获取时区名称,而不是时区对象。在Unix上,如果没有配置时区名称,可能会引发错误,而get_localzone()将成功,因此只有在需要时区名称时才使用它。
4.0版本还增加了有关配置文件不明确或相互矛盾时配置错误的更多信息。
版本5.0删除了pytz_deprecation_shim,现在只返回zoneinfo对象,类似于版本3.0。如果您需要pytz对象,您必须保持在4.0版本。如果4.0版本存在错误,我会发布更新,但在4.x分支上不会有进一步的功能更改。
信息
此Python模块返回您的本地时区的IANA时区名称或一个包含本地时区信息的tzinfo对象,适用于Unix和Windows。
它需要Python 3.8或更高版本,并且将使用backports.tzinfo包,针对Python 3.8。
此模块试图修复pytz和zoneinfo模块中的一个明显漏洞,即无法获取本地时区信息,除非您知道zoneinfo名称,而在某些Linux发行版中,这可能是困难的或不可能的。
使用tzlocal,您只需调用get_localzone(),即可获取包含本地时区信息的tzinfo对象。在某些Unix系统上,您仍然不知道时区名称,但有了tzinfo文件,您就不需要它。然而,如果时区名称容易获得,它将被使用。
它不是用于什么
它不是用于将当前时间在UTC和本地时间之间进行转换。有其他更简单的方法可以做到这一点。如果您需要了解时区名称,或者如果您需要能够将您的时区与另一个时区在未来或过去的时间进行转换。
对于当前时间到UTC的转换,请查看Python的time模块。
支持的系统
以下是理论上支持的系统
Windows 2000及更高版本
任何具有/etc/localtime或/usr/local/etc/localtime的Unix-like系统
如果您拥有上述系统之一并且它不起作用,那么这是一个错误。请报告它。
请注意,如果您得到一个名为local的时区,这不是错误,这是tzlocal的主要功能之一,即即使您的系统没有包含时区名称的配置文件,它仍然可以工作。
您还可以使用tzlocal来获取您的本地时区名称,但前提是您的系统配置允许这样做。tzlocal在/etc/timezone、/var/db/zoneinfo、/etc/sysconfig/clock和/etc/conf.d/clock中查找时区名称。如果您的/etc/localtime是一个符号链接,它也可以从该符号链接中提取名称。
如果您需要本地时区名称,请确保您的系统已正确配置以允许这样做。
如果您的Unix系统未配置时区,tzlocal将默认为UTC。
Docker说明
事实证明,Docker镜像通常有损坏的时区设置。这通常会导致配置错误或时区偏移量与找到的时区不匹配的警告。
修复此问题的最简单方法是设置docker设置中的TZ变量为您想要的任何时区,通常是宿主计算机的时区。
用法
加载本地时区
>>> from tzlocal import get_localzone >>> tz = get_localzone() >>> tz zoneinfo.ZoneInfo(key='Europe/Warsaw')
创建本地datetime
>>> from datetime import datetime >>> dt = datetime(2015, 4, 10, 7, 22, tzinfo=tz) >>> dt datetime.datetime(2015, 4, 10, 7, 22, tzinfo=zoneinfo.ZoneInfo(key='Europe/Warsaw'))
使用zoneinfo(在Python 3.8或更早版本上为backports.zoneinfo)查找另一个时区
>>> from zoneinfo import ZoneInfo >>> eastern = ZoneInfo('US/Eastern')
转换datetime
>>> dt.astimezone(eastern) datetime.datetime(2015, 4, 10, 1, 22, tzinfo=zoneinfo.ZoneInfo(key='US/Eastern'))
如果您只想获取本地时区名称,请使用get_localzone_name()
>>> from tzlocal import get_localzone_name >>> get_localzone_name() "Europe/Warsaw"
请注意,在Unix下,如果未配置时区,get_localzone_name()可能会失败,而get_localzone()通常会成功。
故障排除
如果您没有得到预期的结果,请尝试在开启调试的情况下运行。启动一个已安装tzlocal的python解释器,并运行以下代码
import logging logging.basicConfig(level="DEBUG") import tzlocal tzlocal.get_localzone()
输出应类似于以下内容,这将告诉您找到了哪些配置
DEBUG:root:/etc/timezone found, contents: Europe/Warsaw DEBUG:root:/etc/localtime found DEBUG:root:2 found: {'/etc/timezone': 'Europe/Warsaw', '/etc/localtime is a symlink to': 'Europe/Warsaw'} zoneinfo.ZoneInfo(key='Europe/Warsaw')
开发
为了便于开发,这里提供了一个Makefile,它可以帮助您完成基本任务,例如创建带有所有必要工具的开发环境(尽管您首先需要安装受支持的Python版本)
$ make devenv
运行测试
$ make test
检查语法
$ make check
维护者
Lenart Regebro,regebro@gmail.com
贡献者
Mark Van Olmen
Benjamen Meyer
Manuel Ebert
朱晓昆
Cameris
Edward Betts
MCK KIM
Cris Ewing
Ayala Shachar
Lev Maximov
Jakub Wilk
John Quarles
Preston Landers
Victor Torres
Jean Jordaan
Zackary Welch
Mickaël Schoentgen
Gabriel Corona
Alex Grönholm
Julin S
Miroslav Šedivý
revansSZ
Sam Treweek
Peter Di Pasquale
荣荣
(如果漏掉了某人,请见谅)
许可协议
项目详情
下载文件
下载适用于您平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。