2014-02-12 123 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'