天泣記

2014-02-02 (Sun)

#1

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]


田中哲