Python3是否安全,不会受到即将到来的夏令时变化的影响?

4

背景

我一直无法找到有关Python使用的时间值真正来源的更深入解释。大部分文档都指出它“从CPython获取该值”,但并没有详细说明它来自哪个点以外的地方。

一些国家最近已经或正在考虑更改其夏令时政策。这意味着这些国家的设备可能会自动调整时区,并生成错误的基于GMT的时间,直到它们更新为当前政策。

这本身并不可怕,因为操作系统通常具有良好的更新机制。然而,在同一系统上更新Python有时是一个非常模糊的领域。操作系统可能会处理它,或者Python与应用程序捆绑在一起。也许操作系统仍在获取关键更新,但没有Python更新。

问题 / 问题

我们无法控制Python如何通过我们的代码进行更新。问题在于,由于GMT时间计算过时,我们可能会从Python获取不正确的Unix时间戳。

如果Python将GMT时间计算委托给操作系统,那么我们可以放心。如果Python没有委派它,那么我们可能必须强制该值来自操作系统(例如time +%s)。

所以问题是:Python3是从操作系统获取其GMT时间还是根据本地时间进行自己的计算?


软件是否可能从任何地方获取时间,而不最终依赖于操作系统或某些服务器知道(正确的)时间? - BallpointBen
是的。对于Java,它们有一些类可以让您获取一个时区/ZoneInfo对象,例如“Europe/Moscow”,然后该对象具有处理DST的方法,如useDaylightTime()。值得庆幸的是,根据Zachary的回答,Python似乎没有这样做。Java还幸运地拥有一个工具来更新定义(https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm),但对于我们的情况,最好从操作系统更新中获取。 - Wisteso
1个回答

2
Python不保留自己的时区信息数据库,它委托给操作系统和/或第三方pytz包来处理所有与时区相关的计算。UTC或本地时间戳通过平台的time.h中的C gmtime_*()localtime_*()函数从操作系统获取。
要查看源代码的完整故事,请查看datetime模块的Python版本、相应的C版本,以及pytime.c C模块的time模块

因此,C库似乎是“time.h”,对于非Windows系统使用gmtime_r,对于Windows系统使用gmtime_s。只要我们在Python中调用gmtime,那么我们应该能够避免pytz问题吗?因为在这种情况下,pytz似乎可能存在风险,因为需要支持离线时区转换并且基于Olson tz数据库。 - Wisteso
1
正确;在编辑中澄清了C函数的来源。至于pytz,请记住它是一个第三方包;如果您不安装并使用它,它不会影响您。 - Zachary Ware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接