Python的可靠时区库或网络服务

1 投票
2 回答
612 浏览
提问于 2025-04-17 12:36

我有一个Django网页应用,其中有一个会议日程安排功能,这个功能需要考虑时区。

现在我使用的是pytz这个库,但它有一些严重的问题。

比如说,莫斯科的时区现在比实际时间慢了一个小时,这是因为梅德韦杰夫总统最近决定取消俄罗斯的冬令时(http://en.ria.ru/russia/20111030/168271560.html)。

另一个大问题是,pytz提供的时区列表非常长,而且对用户不太友好,比如有个时区叫“Asia/Shangri-La”。很多比较正规的网页在提供时区选择时,列表都短得多...

我希望能找到一个可靠的解决方案,能够提供准确的时区信息,并且让用户选择时区时更加方便。这个解决方案可以是一个库,能够在像俄罗斯这样的重大变化发生时自动更新,或者是一个可靠且免费的网络服务。

2 个回答

0

最近我在reddit上看到一个关于times的公告,这个库是为了让处理日期时间和时区变得更简单而设计的。

也许这个库没有考虑到你提到的关于莫斯科时区的问题。不过,由于这个库正在积极开发中(最近一次更新是在不到一天前),我觉得主要开发者会愿意提供帮助,接受修复建议等等。

1
  1. 你需要获取一个包含最新Olson/Eggert数据库的pytz版本,这样才能遵循俄罗斯最近的时区政策变化。不过,听说目前对维护者有一个版权诉讼正在进行,所以可能要等一段时间才能更新。你可以去这个链接了解更多信息:http://en.wikipedia.org/wiki/Tz_database#Maintenance。我想你也可以获取pytz的源代码,自己贡献一个补丁。但据我所知,几乎所有好用的时区系统都是基于Olson/Eggert系统的。

  2. 为了让用户体验更好,你可以使用一些提供的查找功能。pytz.common_timezones是一个经过筛选的列表,里面只有用户最可能需要的时区标识符。pytz.country_names是一个国家代码到国家名称(英文)的字典,可以用来显示给用户。pytz.country_timezones是一个国家代码到该国家时区列表的字典。通过使用这些,你可以让用户选择他们的国家,然后再选择最适合该国家的时区,选项可以只显示在common_timezones列表中的选择。

  3. 我见过的选择时区的最简单界面就是一个世界地图,用户点击自己的位置,系统就能判断出可能对应的Olson/Eggert时区。Ubuntu中的那个系统声称是基于http://www.geonames.org/的。除此之外,我觉得pytz或者可能是times模块(jcollado链接的那个)也差不多是最好的选择了。政治时区很复杂,因此处理这些时区的代码也会相应复杂。

请考虑一下我之前关于自动确定浏览器时区的回答:我的回答。在评论中有一种通常正确的JavaScript方法可以做到这一点。

撰写回答