Python的可靠时区库或网络服务
我有一个Django网页应用,其中有一个会议日程安排功能,这个功能需要考虑时区。
现在我使用的是pytz这个库,但它有一些严重的问题。
比如说,莫斯科的时区现在比实际时间慢了一个小时,这是因为梅德韦杰夫总统最近决定取消俄罗斯的冬令时(http://en.ria.ru/russia/20111030/168271560.html)。
另一个大问题是,pytz提供的时区列表非常长,而且对用户不太友好,比如有个时区叫“Asia/Shangri-La”。很多比较正规的网页在提供时区选择时,列表都短得多...
我希望能找到一个可靠的解决方案,能够提供准确的时区信息,并且让用户选择时区时更加方便。这个解决方案可以是一个库,能够在像俄罗斯这样的重大变化发生时自动更新,或者是一个可靠且免费的网络服务。
2 个回答
最近我在reddit上看到一个关于times的公告,这个库是为了让处理日期时间和时区变得更简单而设计的。
也许这个库没有考虑到你提到的关于莫斯科时区的问题。不过,由于这个库正在积极开发中(最近一次更新是在不到一天前),我觉得主要开发者会愿意提供帮助,接受修复建议等等。
你需要获取一个包含最新Olson/Eggert数据库的
pytz
版本,这样才能遵循俄罗斯最近的时区政策变化。不过,听说目前对维护者有一个版权诉讼正在进行,所以可能要等一段时间才能更新。你可以去这个链接了解更多信息:http://en.wikipedia.org/wiki/Tz_database#Maintenance。我想你也可以获取pytz
的源代码,自己贡献一个补丁。但据我所知,几乎所有好用的时区系统都是基于Olson/Eggert系统的。为了让用户体验更好,你可以使用一些提供的查找功能。
pytz.common_timezones
是一个经过筛选的列表,里面只有用户最可能需要的时区标识符。pytz.country_names
是一个国家代码到国家名称(英文)的字典,可以用来显示给用户。pytz.country_timezones
是一个国家代码到该国家时区列表的字典。通过使用这些,你可以让用户选择他们的国家,然后再选择最适合该国家的时区,选项可以只显示在common_timezones
列表中的选择。我见过的选择时区的最简单界面就是一个世界地图,用户点击自己的位置,系统就能判断出可能对应的Olson/Eggert时区。Ubuntu中的那个系统声称是基于http://www.geonames.org/的。除此之外,我觉得
pytz
或者可能是times
模块(jcollado链接的那个)也差不多是最好的选择了。政治时区很复杂,因此处理这些时区的代码也会相应复杂。
请考虑一下我之前关于自动确定浏览器时区的回答:我的回答。在评论中有一种通常正确的JavaScript方法可以做到这一点。