2013-04-22 10 views
7

Windowsのタイムゾーンをタイムゾーンに変換するにはどうすればいいですか?私はこのようなローカルタイムゾーンを取得することができますが、それはpytzと使用できないのWindows Python環境で

>>> import win32timezone 
>>> win32timezone.TimeZoneInfo.local() 
TimeZoneInfo(u'US Mountain Standard Time', True) 
>>> win32timezone.TimeZoneInfo.local().timeZoneName 
u'US Mountain Standard Time' 
>>> tz = pytz.timezone(win32timezone.TimeZoneInfo.local().timeZoneName) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\pytz\__init__.py", line 185, in timezone 
    raise UnknownTimeZoneError(zone) 
pytz.exceptions.UnknownTimeZoneError: 'US Mountain Standard Time' 

タイムゾーン名pytz.timezone(にその出力を変換するための良い方法は何が)理解するだろうか?

>>> from tzlocal.win32 import get_localzone_name 
>>> get_localzone_name() 
'America/Phoenix' 
>>> tz = pytz.timezone(get_localzone_name()) 
>>> tz 
<DstTzInfo 'America/Phoenix' MST-1 day, 17:00:00 STD> 

答えて

9

WindowsのタイムゾーンIDがその名前に基づいて何を意味するかについて、何も仮定しないでください。たとえば、US Mountain Standard Timeは実際にはArizonaの大半のWindowsタイムゾーンです。これは夏時間を実装していないため、MSTに永続的に存在します。しかし、残りの山岳時間帯のWindows IDはMountain Standard Timeです.となり、山岳夏時間の夏時間に従いますが、タイムゾーンIDは変更されません。これらの2つのゾーンIDの唯一の違いは、 "US"接頭辞です。 IANA/Olsonデータベースでは、これらは非常に異なる2つのゾーン、つまりAmerica/PhoenixAmerica/Denverです。

WindowsからUnicode CLDRプロジェクトによって提供されるOlsonタイムゾーンIDへのマッピングが必要です。情報とリンクについては、TimeZone tag wikiをお読みください。 Pythonで既にこれを実装しているライブラリがあるかどうかは不明です。いくつかの研究を行うか、生データから自分で実装する必要があるかもしれません。

UPDATE

検索のビットを、私はCLDRのマッピングを持っているtzlocalと呼ばれるPythonライブラリを見つけました。それは、CLDRウェブサイトから現在のマッピングを取り出して更新するスクリプトを含めるほど親切です。私は自分でそれを試していないが、それは正しいアプローチを持っているようだ。これは主に、pytzでの使用に適したIANA/Olson IDで現在のシステムのタイムゾーンを返すことに重点を置いています。 Here is the author's blog post describing its usage.

+0

マット、それを指摘してくれてありがとう。これは私が元々考えていたよりも複雑な問題のようです。これはすべてのことを考慮に入れたWindowsのpythonライブラリがないことは不思議です... –

+0

Olsonデータベースはあらゆる点で優れています。それがpytzの実装です。 Windowsのタイムゾーンを使用しなければならない理由はありますか? –

+0

私はそれを見逃しているかもしれませんが、pytzを使ってマシンの現在のタイムゾーンのOlsen名を取得する方法がありますか? –

4

Anurag Uniyal has postedコンピュータによって報告TZNAMEとはutcoffsetと一致しているタイムゾーンの名前を発見するための別の方法:


ここtzlocal(マットのおかげで)を使用して、答えがあります。そうしないと

import lxml.etree as ET 
import collections 
import pprint 
result = {} 
doc = ET.parse('http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml') 
for zone in doc.xpath('//mapZone'): 
    attrib = zone.attrib 
    if attrib['territory'] == '001': 
     result[attrib['other']] = attrib['type'] 
pprint.pprint(dict(result)) 

利回り

{'AUS Central Standard Time': 'Australia/Darwin', 
'AUS Eastern Standard Time': 'Australia/Sydney', 
'Afghanistan Standard Time': 'Asia/Kabul', 
'Alaskan Standard Time': 'America/Anchorage', 
'Arab Standard Time': 'Asia/Riyadh', 
'Arabian Standard Time': 'Asia/Dubai', 
'Arabic Standard Time': 'Asia/Baghdad', 
'Argentina Standard Time': 'America/Buenos_Aires', 
'Atlantic Standard Time': 'America/Halifax', 
'Azerbaijan Standard Time': 'Asia/Baku', 
'Azores Standard Time': 'Atlantic/Azores', 
'Bahia Standard Time': 'America/Bahia', 
'Bangladesh Standard Time': 'Asia/Dhaka', 
'Canada Central Standard Time': 'America/Regina', 
'Cape Verde Standard Time': 'Atlantic/Cape_Verde', 
'Caucasus Standard Time': 'Asia/Yerevan', 
'Cen. Australia Standard Time': 'Australia/Adelaide', 
'Central America Standard Time': 'America/Guatemala', 
'Central Asia Standard Time': 'Asia/Almaty', 
'Central Brazilian Standard Time': 'America/Cuiaba', 
'Central Europe Standard Time': 'Europe/Budapest', 
'Central European Standard Time': 'Europe/Warsaw', 
'Central Pacific Standard Time': 'Pacific/Guadalcanal', 
'Central Standard Time': 'America/Chicago', 
'Central Standard Time (Mexico)': 'America/Mexico_City', 
'China Standard Time': 'Asia/Shanghai', 
'Dateline Standard Time': 'Etc/GMT+12', 
'E. Africa Standard Time': 'Africa/Nairobi', 
'E. Australia Standard Time': 'Australia/Brisbane', 
'E. Europe Standard Time': 'Asia/Nicosia', 
'E. South America Standard Time': 'America/Sao_Paulo', 
'Eastern Standard Time': 'America/New_York', 
'Egypt Standard Time': 'Africa/Cairo', 
'Ekaterinburg Standard Time': 'Asia/Yekaterinburg', 
'FLE Standard Time': 'Europe/Kiev', 
'Fiji Standard Time': 'Pacific/Fiji', 
'GMT Standard Time': 'Europe/London', 
'GTB Standard Time': 'Europe/Bucharest', 
'Georgian Standard Time': 'Asia/Tbilisi', 
'Greenland Standard Time': 'America/Godthab', 
'Greenwich Standard Time': 'Atlantic/Reykjavik', 
'Hawaiian Standard Time': 'Pacific/Honolulu', 
'India Standard Time': 'Asia/Calcutta', 
'Iran Standard Time': 'Asia/Tehran', 
'Israel Standard Time': 'Asia/Jerusalem', 
'Jordan Standard Time': 'Asia/Amman', 
'Kaliningrad Standard Time': 'Europe/Kaliningrad', 
'Korea Standard Time': 'Asia/Seoul', 
'Magadan Standard Time': 'Asia/Magadan', 
'Mauritius Standard Time': 'Indian/Mauritius', 
'Middle East Standard Time': 'Asia/Beirut', 
'Montevideo Standard Time': 'America/Montevideo', 
'Morocco Standard Time': 'Africa/Casablanca', 
'Mountain Standard Time': 'America/Denver', 
'Mountain Standard Time (Mexico)': 'America/Chihuahua', 
'Myanmar Standard Time': 'Asia/Rangoon', 
'N. Central Asia Standard Time': 'Asia/Novosibirsk', 
'Namibia Standard Time': 'Africa/Windhoek', 
'Nepal Standard Time': 'Asia/Katmandu', 
'New Zealand Standard Time': 'Pacific/Auckland', 
'Newfoundland Standard Time': 'America/St_Johns', 
'North Asia East Standard Time': 'Asia/Irkutsk', 
'North Asia Standard Time': 'Asia/Krasnoyarsk', 
'Pacific SA Standard Time': 'America/Santiago', 
'Pacific Standard Time': 'America/Los_Angeles', 
'Pacific Standard Time (Mexico)': 'America/Santa_Isabel', 
'Pakistan Standard Time': 'Asia/Karachi', 
'Paraguay Standard Time': 'America/Asuncion', 
'Romance Standard Time': 'Europe/Paris', 
'Russian Standard Time': 'Europe/Moscow', 
'SA Eastern Standard Time': 'America/Cayenne', 
'SA Pacific Standard Time': 'America/Bogota', 
'SA Western Standard Time': 'America/La_Paz', 
'SE Asia Standard Time': 'Asia/Bangkok', 
'Samoa Standard Time': 'Pacific/Apia', 
'Singapore Standard Time': 'Asia/Singapore', 
'South Africa Standard Time': 'Africa/Johannesburg', 
'Sri Lanka Standard Time': 'Asia/Colombo', 
'Syria Standard Time': 'Asia/Damascus', 
'Taipei Standard Time': 'Asia/Taipei', 
'Tasmania Standard Time': 'Australia/Hobart', 
'Tokyo Standard Time': 'Asia/Tokyo', 
'Tonga Standard Time': 'Pacific/Tongatapu', 
'Turkey Standard Time': 'Europe/Istanbul', 
'US Eastern Standard Time': 'America/Indianapolis', 
'US Mountain Standard Time': 'America/Phoenix', 
'UTC': 'Etc/GMT', 
'UTC+12': 'Etc/GMT-12', 
'UTC-02': 'Etc/GMT+2', 
'UTC-11': 'Etc/GMT+11', 
'Ulaanbaatar Standard Time': 'Asia/Ulaanbaatar', 
'Venezuela Standard Time': 'America/Caracas', 
'Vladivostok Standard Time': 'Asia/Vladivostok', 
'W. Australia Standard Time': 'Australia/Perth', 
'W. Central Africa Standard Time': 'Africa/Lagos', 
'W. Europe Standard Time': 'Europe/Berlin', 
'West Asia Standard Time': 'Asia/Tashkent', 
'West Pacific Standard Time': 'Pacific/Port_Moresby', 
'Yakutsk Standard Time': 'Asia/Yakutsk'} 

:ここでは、マット・ジョンソンのソリューションにフォローアップ


あなたはオルソンのタイムゾーン名に、WindowsのタイムゾーンのIDからUnicode Common Locale Data Repository (CLDR) mappingをロードすることができる方法でありますあなたのプログラムがlxmlやネットワーク接続に依存することを望むなら、このdictをモジュールに貼り付けてそこから使うことができます。

+0

興味深いテクニック...私は明日の私の共通のタイムゾーンのいくつかを介して実行し、どのように動作するかを教えて! –

+0

あなたが何かのIDについて話しているときには、マッチを閉じるのは良い考えではありません。彼らがちょうど名前だったら、確かに。しかし、各ゾーンの特定のIDは非常に特殊な意味を持っています。詳細は私の答えを見てください。 –

+0

あなたのアップデートの興味深いリンク。私は興味がありますが、Windowsゾーンでどのように役立ちますか?また、私はその記事でどのソースデータを見ているのか分かりませんが、彼らはLinuxの 'TZ'変数から値を得ていると述べていますが、私が知る限り、これはすでにOlsonの識別子です。 –

関連する問題