2014-02-12 92 views
4

我对Python的pytz有一个很奇怪的问题:它似乎在我的系统上有不完整的时区目录(MacOS X 10.8.5,系统Python 2.7.5)。时区信息在pytz中丢失?

>>> from pytz import timezone 
>>> import pytz 

>>> utc = pytz.utc 
>>> utc.zone 
'UTC' 

>>> eastern = timezone('US/Eastern') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pytz/__init__.pyc", line 182, in timezone 

pytz.exceptions.UnknownTimeZoneError: 'US/Eastern' 

因此无法找到时区'US/Eastern'。 因此我想看看时区的目录中pytz提供:

>>> from pytz import all_timezones 
>>> for tz in pytz.all_timezones: 
...  print tz 
... 
Africa/Abidjan 
Africa/Accra 
Africa/Addis_Ababa 
Africa/Algiers 
Africa/Asmara 
Africa/Asmera 
Africa/Bamako 
Africa/Bangui 
Africa/Banjul 
Africa/Bissau 
Africa/Blantyre 
Africa/Brazzaville 
Africa/Bujumbura 
Africa/Cairo 
Africa/Casablanca 
Africa/Ceuta 
Africa/Conakry 
Africa/Dakar 
Africa/Dar_es_Salaam 
Africa/Djibouti 
Africa/Douala 
Africa/El_Aaiun 
Africa/Freetown 
Africa/Gaborone 
Africa/Harare 
Africa/Johannesburg 
Africa/Juba 
Africa/Kampala 
Africa/Khartoum 
Africa/Kigali 
Africa/Kinshasa 
Africa/Lagos 
Africa/Libreville 
Africa/Lome 
Africa/Luanda 
Africa/Lubumbashi 
Africa/Lusaka 
Africa/Malabo 
Africa/Maputo 
Africa/Maseru 
Africa/Mbabane 
Africa/Mogadishu 
Africa/Monrovia 
Africa/Nairobi 
Africa/Ndjamena 
Africa/Niamey 
Africa/Nouakchott 
Africa/Ouagadougou 
Africa/Porto-Novo 
Africa/Sao_Tome 
Africa/Timbuktu 
Africa/Tripoli 
Africa/Tunis 
Africa/Windhoek 
America/Adak 
America/Anchorage 
America/Anguilla 
America/Antigua 
America/Araguaina 
America/Argentina/Buenos_Aires 
America/Argentina/Catamarca 
America/Argentina/ComodRivadavia 
America/Argentina/Cordoba 
America/Argentina/Jujuy 
America/Argentina/La_Rioja 
America/Argentina/Mendoza 
America/Argentina/Rio_Gallegos 
America/Argentina/Salta 
America/Argentina/San_Juan 
America/Argentina/San_Luis 
America/Argentina/Tucuman 
America/Argentina/Ushuaia 
America/Aruba 
America/Asuncion 
America/Atikokan 
America/Atka 
America/Bahia 
America/Bahia_Banderas 
America/Barbados 
America/Belem 
America/Belize 
America/Blanc-Sablon 
America/Boa_Vista 
America/Bogota 
America/Boise 
America/Buenos_Aires 
America/Cambridge_Bay 
America/Campo_Grande 
America/Cancun 
America/Caracas 
America/Catamarca 
America/Cayenne 
America/Cayman 
America/Chicago 
America/Chihuahua 
America/Coral_Harbour 
America/Cordoba 
America/Costa_Rica 
America/Creston 
America/Cuiaba 
America/Curacao 
America/Danmarkshavn 
America/Dawson 
America/Dawson_Creek 
America/Denver 
America/Detroit 
America/Dominica 
America/Edmonton 
America/Eirunepe 
America/El_Salvador 
America/Ensenada 
America/Fort_Wayne 
America/Fortaleza 
America/Glace_Bay 
America/Godthab 
America/Goose_Bay 
America/Grand_Turk 
America/Grenada 
America/Guadeloupe 
America/Guatemala 
America/Guayaquil 
America/Guyana 
America/Halifax 
America/Havana 
America/Hermosillo 
America/Indiana/Indianapolis 
America/Indiana/Knox 
America/Indiana/Marengo 
America/Indiana/Petersburg 
America/Indiana/Tell_City 
America/Indiana/Vevay 
America/Indiana/Vincennes 
America/Indiana/Winamac 
America/Indianapolis 
America/Inuvik 
America/Iqaluit 
America/Jamaica 
America/Jujuy 
America/Juneau 
America/Kentucky/Louisville 
America/Kentucky/Monticello 
America/Knox_IN 
America/Kralendijk 
America/La_Paz 
America/Lima 
America/Los_Angeles 

所以你可以看到,它结束而过早和许多许多时区失踪。 我试图通过更新Olson数据库pytz克服这种内部使用:

$ sudo pip install -U pytz 

但问题仍然存在...

任何想法可能是错误怎么回事?我错过了什么吗?

+0

“美国/东方”已过时 –

+0

'亚洲/东京'也不起作用。你在哪里找到有关不赞成使用的时区的信息? –

+0

@ Leonardo.Z美国/东部'存在于pytz。 –

回答

2

我不能说为什么你pytz安装坏了,但这里有一个可能的解决办法:

  1. 下载的pytz from the Python Package Index .zip存档。
  2. 在Terminal.app中,运行pip show pytz
  3. 使用返回的路径,运行open /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python(如果不同,请用您的路径替换我的路径)。这将使用您的Python模块启动Finder窗口。
  4. 找到pytz /文件夹。打开它。
  5. 将Zoneinfo /文件夹替换为您在步骤1中从PyPI下载的.zip存档中的zoneinfo /文件夹。
+0

谢谢@Jacob,完全解决了这个问题! –

4

了解到,在pytz时区数据来自IANA time zone database,也被称为奥尔森数据库,或者干脆the tz database

在这些数据中,某些标识符(如US/Eastern)仅仅是指向实时时区的指针(又名“链接”或“别名”)。链接出于几种不同的原因,通常为了向后兼容的目的。在这种情况下,US/Eastern时区是到America/New_York的链接,这是您应该使用的真实时区。 (我相信这个特殊的转换发生在1993年)。

你可以看到其他时区中只是有向后兼容性here。另请参阅this chart on Wikipedia,其中列出了时区,并清楚地指出哪些区域是链接以及这些链接指向的位置。

至于为什么 pytz不接受您的系统上的向后兼容区域,我不完全确定。它当然应该,甚至在文档中显示这些。按照Jacob的建议,您可以尝试重新安装它。但即使如此,您应该更喜欢America/New_York而不是US/Eastern

0

对我来说这是很容易,因为通过pip3 -install pytz --update更新pytz包在AWS Linux机器,我不得不执行它这样python3 -m pip install pytz --update

我的应用程序在抱怨unknown timezone 'America/Punta_Arenas'