localtime() で (UTCからの) 時差をいくつか調べればタイムゾーンを同定し、略称を求められるだろうか。ちょっと調べてみた。
% ruby -rpp -I. -rtzfile -e ' h = {} TZFile.each {|tz_name, tz| a1 = [] a2 = [] tz.each_range {|t1, tt, t2| t1 = t1.strftime("%F %T") if tz === t1 t2 = t2.strftime("%F %T") if tz === t2 k1 = tt.utc_offset if a1.empty? || a1[-1][1] != k1 a1 << [t1, k1, t2] else a1[-1][2] = t2 end k2 = [tt.utc_offset, tt.abbrev] if a2.empty? || a2[-1][1] != k2 a2 << [t1, k2, t2] else a2[-1][2] = t2 end } h[a1] ||= {} h[a1][a2] ||= [] h[a1][a2] << tz_name } h.each {|a1, a2_tzs| next if a2_tzs.size == 1 pp a2_tzs } '
結果としては同定できないものがいくつか見つかった。
ほとんどは時差をまったく変えたことがないタイムゾーンのようだ。たとえば、ずっと +10:00 なタイムゾーンは
というものがあって、4種類のどれかまではわからない。
複数のタイムゾーンが同じタイミングで同じように時差を変えているが、略称は異なる、というケースもあった。Asia/Kuala_Lumpur と Asia/Singapore がそうで、出力から取り出して (ちょっと整形した後) 比較してみた。
@@ -4,9 +4,13 @@ ["1936-01-01 00:00:00", [26400, "MALT"], "1941-09-01 00:10:00"], ["1941-09-01 00:10:00", [27000, "MALT"], "1942-02-16 01:30:00"], ["1942-02-16 01:30:00", [32400, "JST"], "1945-09-11 22:30:00"], - ["1945-09-11 22:30:00", [27000, "MALT"], "1982-01-01 00:30:00"], - ["1982-01-01 00:30:00", [28800, "MYT"], false]]=> + ["1945-09-11 22:30:00", [27000, "MALT"], "1965-08-09 00:00:00"], + ["1965-08-09 00:00:00", [27000, "SGT"], "1982-01-01 00:30:00"], + ["1982-01-01 00:30:00", [28800, "SGT"], false]]=> - ["Asia/Kuala_Lumpur", - "posix/Asia/Kuala_Lumpur", - "right/Asia/Kuala_Lumpur"], + ["Asia/Singapore", + "Singapore", + "posix/Asia/Singapore", + "posix/Singapore", + "right/Asia/Singapore", + "right/Singapore"]
1965-08-09 から異なる。調べてみるとマレーシアからシンガポールが独立した日のようだ。独立にともなってタイムゾーンの略称を変えたが、UTCからの時差は変えなかった、ということだろう。
同定するにはもうすこし情報が必要なようだ。
[latest]