今回は まだ検討中のアプリの話
このアプリではいわゆる世界時計機能が必要なんです。
タイムゾーンが分かれば、日時を表示することは簡単。たとえば、
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
Africa/Accra
・・・
Pacific/Wallis
でもこれには、
San Franciscoも載っていないレベル。 また、国名が分からないので、同名都市もあるし、国名から検索もできないので不便です。
tz database
このDBは、パブリックなタイムゾーンのデータデータベースで、
America/Los_Angelesというような命名規則を作った おおもとデータなんですね。いろいろ工夫した末の命名規則のようです。いろんな所からD/Lできるようですが、
ここから落としてみました
(2014/9/24時点で415タイムゾーンのデータが格納されていました)。
1, AD, Europe/Andorra
・・・
390, US, America/Los_Angeles
・・・
415, ZW, Africa/Harare
zone.csvが上記のような国名の省略形とタイムゾーンの組の形式になっていて、国名の省略形と通常形の組のcountry.csvと合わせるとタイムゾーンの国名が分かります。
knownTimeZoneNamesと比べて10都市くらい足りないけど、これくらいなら自力で調べられる範囲ですね。
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
Ghana/Accra, Africa/Accra
・・・
Wallis and Futuna/Wallis, Pacific/Wallis
これを city time zoneと混ぜ(等価結合、VLookup)ます。 Japan/Tokyoが一致するので Tokyo Standard TimeをAsia/Tokyoに変換でき、同じタイムゾーンのOsakaも Asia/Tokyoと変換できます。
knownTimeZoneNamesにしかない都市や、city time zoneにしかないゾーンもあり、最終的には1478都市の辞書ができました。 そのうち、適当な場所で公開したいと思っております。