今回は まだ検討中のアプリの話
このアプリではいわゆる世界時計機能が必要なんです。
タイムゾーンが分かれば、日時を表示することは簡単。たとえば、America/Los_Angelesなら下記のようにすればできます。
課題になるのは、国名・都市名からタイムゾーンを調べられる辞書が必要なのこと。
今回はそれについて調べました。
このアプリではいわゆる世界時計機能が必要なんです。
タイムゾーンが分かれば、日時を表示することは簡単。たとえば、America/Los_Angelesなら下記のようにすればできます。
NSDate* date = [NSDate date] ;
NSDateFormatter *formatter = [[NSDateFormatter alloc]init] ;
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]] ;
[formatter setDateFormat:@"dd a HH:mm (zzz)"] ;
NSLog(@"%@",[formatter stringFromDate:date]) ;
課題になるのは、国名・都市名からタイムゾーンを調べられる辞書が必要なのこと。
今回はそれについて調べました。
iOSが持っているタイムゾーンのリスト
主要都市のタイムゾーンはNSog(@"%@",[NSTimeZone knownTimeZoneNames]); で表示できます(iOS8で425タイムゾーンのデータが表示されました)。Africa/Abidjanでもこれには、San Franciscoも載っていないレベル。 また、国名が分からないので、同名都市もあるし、国名から検索もできないので不便です。
Africa/Accra
・・・
Pacific/Wallis
tz database
このDBは、パブリックなタイムゾーンのデータデータベースで、America/Los_Angelesというような命名規則を作った おおもとデータなんですね。いろいろ工夫した末の命名規則のようです。いろんな所からD/Lできるようですが、ここから落としてみました(2014/9/24時点で415タイムゾーンのデータが格納されていました)。1, AD, Europe/Andorrazone.csvが上記のような国名の省略形とタイムゾーンの組の形式になっていて、国名の省略形と通常形の組のcountry.csvと合わせるとタイムゾーンの国名が分かります。knownTimeZoneNamesと比べて10都市くらい足りないけど、これくらいなら自力で調べられる範囲ですね。
・・・
390, US, America/Los_Angeles
・・・
415, ZW, Africa/Harare
City time zone
このDBは、千都市以上のタイムゾーンが載ってます(2014/10/3時点で1310都市のデータが格納されていました)。ただ、タイムゾーンが Tokyo Standard Timeなどの表記で iOSで使える形式ではないので、国名と都市名をもとに変換する必要があります。ただ、2つの都市が同じタイムゾーンだということが重要な情報で、Tokyo Standard TimeのOsakaのタイムゾーンが Asia/Tokyoに出来るわけです。結合と変換
knownTimeZoneNamesと tzdataから、"国名/都市名"とタイムゾーン名のペアを作ります。Ivory Coast/Abidjan, Africa/Abidjanこれを city time zoneと混ぜ(等価結合、VLookup)ます。 Japan/Tokyoが一致するので Tokyo Standard TimeをAsia/Tokyoに変換でき、同じタイムゾーンのOsakaも Asia/Tokyoと変換できます。 knownTimeZoneNamesにしかない都市や、city time zoneにしかないゾーンもあり、最終的には1478都市の辞書ができました。 そのうち、適当な場所で公開したいと思っております。
Ghana/Accra, Africa/Accra
・・・
Wallis and Futuna/Wallis, Pacific/Wallis