2 ポイント 投稿者 GN⁺ 2024-10-31 | 1件のコメント | WhatsAppで共有
  • タイムゾーンは複雑だが、コンピュータがこれを実装しなければならないため、奇妙さは有限の範囲に収まる。
    • Asia/Kathmandu は UTC から見て変則的なオフセットを持つ。
    • Africa/Casablanca はタイムゾーンモデルにうまく当てはまらないため、ハードコードされている。
    • America/Nuuk は -01:00 からサマータイムを開始する。
    • Africa/CairoAmerica/Santiago は 24時(0時ではない)にサマータイムを開始する。
    • Australia/Lord_Howe は最も奇妙なサマータイム規則を持つ。

PGXIIREAM: 教皇グレゴリウス13世がすべてを支配している

  • 世界の大半はグレゴリオ暦に基づく時間システムを使っている。
  • グレゴリオ暦は、年間を通して太陽の位置を一定に保つのに非常に有用である。
  • UTC はグレゴリオ暦を現代的に公式化したものであり、世界中がこれを基準に時刻を設定している。

うるう秒は重要ではない

  • 地球の自転は遅くなっており、それを補正するためにうるう秒が追加される。
  • 多くのプログラミング言語では61秒を表現しないため、うるう秒は無視してよい。
  • クラウドプロバイダは、うるう秒の間に時計をゆっくり進めることで問題を解決している。

奇妙なタイムゾーン

Asia/Kathmandu は変則的なオフセットを持つ

  • ネパールは UTC より 5時間45分進んでいる。
  • コンピュータは IANA タイムゾーンデータベースを通じてこの情報を知ることができる。

PDTCET のような文字列には意味がない

  • タイムゾーン識別子は曖昧なことがあり、多くのタイムゾーンが同じ識別子を共有している。

サマータイムのあるタイムゾーンはどのように表現されるのか?

  • サマータイムの切り替え規則は複雑であり、コンピュータはそれに基づいて現地時刻を計算する。

Africa/CasablancaAsia/Gaza は月に従うが、タイムゾーンは太陽に従う

  • モロッコとガザはラマダンに合わせてサマータイムを調整しており、これはハードコードされている。

America/Nuuk は -1時にサマータイムへ切り替わる

  • グリーンランドはヨーロッパと同じ時点でサマータイムを開始するが、現地時間では -1時に始まる。

America/SantiagoAfrica/Cairo は 24時に切り替わる

  • これらのタイムゾーンは 24時にサマータイムへ切り替わり、それは翌日にまたがることを意味する。

Australia/Lord_Howe は最も奇妙なサマータイム切り替えを持つ

  • ロード・ハウ島では30分のサマータイム切り替えがある。

GN⁺ のまとめ

  • タイムゾーンは複雑だが、コンピュータがこれを実装しなければならないため、奇妙さは有限の範囲に収まる。
  • Australia/Lord_Howe は30分のサマータイム切り替えを持つ、最も独特なタイムゾーンである。
  • この記事はタイムゾーンの複雑さを理解するのに役立ち、プログラマにとって興味深い内容になりうる。
  • 類似した機能を持つプロジェクトとして tzdb がある。

1件のコメント

 
GN⁺ 2024-10-31
Hacker Newsのコメント
  • tzデータベースでいちばん面白い部分は、ビッグバン時点の推定値が入っていて、ビッグバン以前に発生するタイムゾーン遷移は計算しないようになっていること
    https://github.com/eggert/tz/commit/b22d459a367f4d01b10f6f6b... のコミットメッセージも「ビッグバン以前のタイムスタンプは物理的に疑わしいので生成しないようにしよう」という趣旨で、ほどなく別コミットでビッグバン以前のうるう秒も禁止された

    • 昔、Linux/Unix の date における過去の日付の意味を扱った長い man ページがあった
      15世紀ごろの例とともに、ある王が特定の週や月を気に入って繰り返すよう命じたり、別の王が特定の週を嫌って暦から消したりした、という話が載っていてかなり目を開かされる読み物だったが、今は見つからない
    • かなり実用的な決定に見える。貢献者のあいだで ピンの先の天使論争 のような不毛な議論をあらかじめ防ぐ良いやり方
      言い換えると、「ビッグバン以前の瞬間はこのライブラリのスコープ外なので、あるアルゴリズムがビッグバン以前でのみ誤った値を返すなら、そのアルゴリズムは受け入れ可能で、改善や置き換えは不要だ」という結論になる
    • 本当にすばらしい部分だが、別件として tzdb が Unix epoch 以前 まで扱おうとしていることには少し懐疑的
      その部分はバグに対する効用があまり大きく見えず、tzdb の汚い複雑さの大半は zic にある。ときどき zic が他の人たちの依存先になりうる成果物でなければ、もっとよかったのにと思う
    • TZ データベースの面白い イースターエッグ。初めて知ったが、そんなに古いタイムゾーンデータを計算することがどれだけあるのかと思う
      タイムゾーン理論が古びる前に、タイムゾーン自体が消えてくれればいいのに
  • いちばん変なタイムゾーンは Africa/Addis_Ababa だと思う。肝心の エチオピアの現地の人々 はその方式に従っていない
    現地では時刻を6時間ずらして、夜明けである午前6時に AM サイクルが始まり、日暮れである午後6時に PM サイクルが始まる
    https://en.wikipedia.org/wiki/Time_in_Ethiopia

    • ケニアを含む 東アフリカ 一帯で一般的な方式。夜は午前6時に終わり、午前7時はその日の最初の時刻である saa moja になる
      同様に一日は午後6時、thenashara で終わる。直感的には英語圏の時計よりずっと筋が通っていて、言語の中に埋め込まれているので時刻の混同もまれ
    • エチオピアの時刻の数え方は全体的に独特
      https://en.wikipedia.org/wiki/Ethiopian_calendar
      エチオピア暦 は30日ある12か月と、第13の月を構成する5日または6日の閏日的な日付から成る
    • ローマ人の時間の捉え方ととても似ている。北アフリカが複数の属州だった時代の古い名残なのか気になる
      https://en.wikipedia.org/wiki/Roman_timekeeping
    • 赤道近くの国なら、一日のサイクルの定義の仕方としてそこまで不合理ではない
    • 日本でも、深夜0時を過ぎて営業する施設などでは似たような考え方を使う: https://en.wikipedia.org/wiki/Date_and_time_notation_in_Japa...
      英語圏でも昔は3月25日に年が変わっていた: https://en.wikipedia.org/wiki/Calendar_(New_Style)_Act_1750#...
      どちらも技術的には tzdb の対象ではない。tzdb が扱うのは市民時刻であって、暦やほかの計算法まで扱うわけではない
  • Asia/Jerusalem の変わった点は、夏時間 が政教分離の問題と大きく絡んでいること。宗教的な人々は、日没に始まる祝祭日に合わせて勤務日が都合よくなることを望む
    そのため2000年代半ばまで何十年ものあいだ、夏時間は宗教政党と世俗政党のあいだの毎年の交渉の結果で、切り替え日の直前になってようやく決まり、問題が頻発していた
    いまでも Rosh HaShanah に夏時間が終わらないようにする例外が入っていて、そのせいで将来ルールが複雑に見えるのだと思う

    • 夏時間の利点は限られているし、とくに比較的南にある国なら、なぜ完全に廃止しないのか不思議
      EU が最終的に廃止に成功すれば追随するかもしれない
    • 過越祭のため。Seder という大きな祝いの食事は真夜中を過ぎるまで続き、子どもたちにとっても非常に重要な行事
      だから夏時間によって、もともと遅い時間に終わる行事がさらに遅くなるのを望まない。また Yom Kippur の断食日には、断食が1時間早く終わってほしいという事情もあった。これらの日付に合わせようとすると夏時間の期間が短くなりすぎるため、交渉が必要になっていた
    • もはや例外はない。IDT は 2013 年に 10 月最後の日曜日まで延長された
  • 「プログラミング言語は61秒の分を表現できない」というのは、実は事実ではない。すでに誰かがRakuはうるう秒をサポートしていると言っていたが、それは部分的には私のせいかもしれない
    Perl 5で最も人気のある日付/時刻ライブラリ DateTime.pm がうるう秒をサポートしており、私が DateTime.pm を作ったときにそのサポートを実装した
    振り返ると、ほぼ確実に失敗だった。うるう秒に関心のある人はほとんどおらず、「60秒足すのと1分足すのは、なぜたまに違うのか?」のような妙な混乱を生むだけだ
    特に second => 60 が有効かどうかを検証しようとしたため、コードははるかに複雑になった。コンストラクタは時刻の構成要素と任意のタイムゾーンを受け取るので、うるう秒テーブルを確認するにはUTCへ変換しなければならず、その変換自体が歴史的理由からうるう秒を含む値と絡み合うことになる
    ごく小さな利益のために巨大な混乱になってしまったし、Rakuの標準日付/時刻ライブラリもPerl 5の DateTime.pm から多くを借りているようなので、同じ悪い設計判断を一部受け継いでしまったのだと思う

    • そう実装しておいたおかげで、後からもっとエレガントな解法を振り返ることができたのはよかった
      最初はどんな思考プロセスだったのか気になる。問題に没頭しすぎていたのだろうか。問題に近すぎる状態で長く集中していると、壊れる前に直す楽しさが先に立って、こういうことが起きがちだ
    • Rakuには Instant クラスがある
      「Instantは原子秒とその小数部分で測られる特定の瞬間であり、どのepochにも結び付けられておらず、それを意識もしない」といった形で定義されている
  • 今年の初め、米国の住所が与えられたときに現在の現地時刻を見つける関数を書かなければならなかった。素朴なやり方は州をタイムゾーンに静的にマッピングすることだが、それを不可能にする例外がかなりある
    そのアプリケーションではコストと速度が重要だったので、米国のすべての ZIP code をUTCオフセットや夏時間遵守の有無などにマッピングしたCSVを数ドルで買った
    pytz はIANAタイムゾーン名を受け取るため、結局はオフセットと夏時間の情報を特定のタイムゾーンへ手動でマッピングしなければならず、米国の海外領土や軍事基地のために Etc タイムゾーンのような奇妙な意味論も必要だった
    [1] https://en.wikipedia.org/wiki/Tz_database#Area

    • 州単位では解像度が完全に間違っている。米国のタイムゾーンはや先住民居留地の境界に沿っている
      ZIP codeでもおそらく十分かもしれないが、注意は必要だ。住所の数が多すぎないなら、より堅牢な方法は逆ジオコーディングしたうえで、タイムゾーン境界ポリゴンからIANA識別子を取得するライブラリを使うことだ
      https://github.com/RomanIakovlev/timeshape は以前の同僚が管理していて、社内で行っていた作業の一部をオープンソースとして公開できた
    • 1985年、大学を出たばかりの若いエンジニアだったころ、米国の複数のレーダーサイトで磁気テープに記録された遠隔測定データを結合する仕事を任された
      1つか2つのシステムはデータに現地時刻を付け、残りはUTCを使っていた。夏時間を処理するアルゴリズムを作ろうとして昔の Farmers' Almanac を買ったが、ルールを読んで絶望した
      暦には切り替えの名目上のルールが載っていたが、議会の介入により毎年調整されてきたし、今後もそうだろうという脚注があった。上司には「議会の将来の採決を予測するアルゴリズムが書けるなら、億万長者になってこのエンジニアの仕事は辞めている」と言った
      結局、直近の既知の切り替えと将来の名目上のルールをコード化したのだと思う。まだみんながネットワーク接続される前で、コードはVAXのようなスタンドアロンのコンピュータで動いていたので、他にあまり方法がなかった
      それぞれ有効性と測定品質低下の状態を持つ3つの追跡データソースを結合する作業も悪夢だったが、それでも議会の将来の行動を予測するよりは簡単だった
    • 良いやり方は、ZIP codeを US/Eastern のような名前付きタイムゾーンにマッピングすることだ。その後UTCオフセットが必要なら、pytz でその日付にタイムゾーンを適用してオフセットを取得すればよい
      名前付きタイムゾーンは固定的なので特別だ。-05:00 のようなUTCオフセットのタイムゾーンや EST のような略称は、夏時間のせいで特定の場所では時間によって固定されない
      誰かにタイムゾーンを尋ねるとき、オフセットや略称を選択肢として出すと、みんな混乱してしまう
    • 今年の初めに似たようなことをしたが、住所を緯度・経度に変換するジオロケーションサービスを使い、さらに緯度・経度からタイムゾーンを求めた。単一タイムゾーンの州にはショートカットを用意した
      緯度・経度 → タイムゾーン変換にはこのPythonライブラリを使った: https://github.com/jannikmi/timezonefinder
      データソースもかなり高品質なものに見えた: https://github.com/evansiroky/timezone-boundary-builder/rele...
    • Etc 識別子は本当に注意が必要だ。特にすべての識別子をそのままユーザーに見せようとしていたならなおさらだ
      そのファイルには「POSIXはグリニッジの西を正とするが、多くの人はグリニッジの東を正だと期待する。たとえば TZ='Etc/GMT+4' は略称 -04 を使い、UTより4時間遅い、つまりグリニッジの西を意味するが、多くの人はUTより4時間速い東側を期待する」というコメントがある
  • パレスチナのタイムゾーンもかなり変わっている
    https://en.wikipedia.org/wiki/Time_in_the_State_of_Palestine
    夏時間はあるが日付が固定されておらず、政府が毎年開始と終了の時点を発表する。時には1週間も前になってから発表されるため、さまざまな興味深い問題が起きざるを得ない

    • 同じ物理的な場所に住む2人が、民族的・地政学的アイデンティティによって 異なる現在時刻 に従う現象が起きる
      イスラエルとパレスチナの夏時間の開始日・終了日が必ずしも同じではない
    • 今もそうなのかは分からないが、ブラジルも以前はそうだった。そのせいで飛行機にほとんど乗り遅れそうになったことがある
    • 実際に本文で触れられている内容で、ラマダン と結び付いている
    • 政治の話を深くしなくても、なぜ夏時間に優先して労力を注ぐのかはあまり理解できない。他にもっと大きな心配事がたくさんあるように見える
  • 1時間ではなく30分差の夏時間を「最も変わったタイムゾーン」と呼ぶには、基準が低すぎると思う
    ほとんど他のものの方がもっと変わっている。Antarctica/Troll の方が明らかに奇妙に聞こえるし、モロッコやガザのタイムゾーンは既存のシステムでは表現できないほどで、少なくとも別種のルールがある。Apple の禁止リストに載った、特定の日付の前日に切り替わるタイムゾーンも、何かを壊してしまうほどには奇妙だ
    うるう秒については同意する。プログラマーが知っておくべき有用な知識というより、ほとんど雑学だ。コンピュータはうるう秒をスミア処理するし、それがいつ起きたのかも分からない。完全に忘れて生きていても構わない
    ただし、各国がうるう秒を無視する方式から考慮する方式へ移行したことがあり、数十年前のオーストラリアでの GMT+x から UTC+x への変更は、うるう秒を無視するものから含めるものへ移る転換だった。この事実がほぼ普遍的に無視されているのは、むしろ良いことなのかもしれない

    • 概ね、うるう秒が雑学だという点には同意する
      ただ、ある大規模組織が「我々のサーバーは GPS 同期と自社開発の PCIe ルビジウム原子時計カードのおかげでミリ秒未満の時刻精度を持つ」と言いながら、同時に「うるう秒は1日かけてスミアするので、実際のサーバー時刻が ±0.5 秒ずれていても問題ない」と言うのは、いつも少し滑稽だ
      [1] https://engineering.fb.com/2021/08/11/open-source/time-appli...
      [2] https://engineering.fb.com/2020/03/18/production-engineering...
    • ラマダンの日付はよく知られた固定値ではない。地球上の特定地域で 月を実際に見ることができるか に基づくからだ
      たとえば空が非常に曇っていれば、月がどこにあっても見ることはできない。このため、国家運営のために暦を実装する際に問題が生じる
      イスラム暦を公式採用している多くの国は、特定の地点での予想可視性に基づいて事前計算した近似日付を使っている。したがってイスラム暦は実際には1つではなく、観測イスラム暦と予測暦という2つに近く、どちらも実際または予測される観測が行われる場所に依存している
      モロッコやガザがどうしているのかは分からない
    • Antarctica/Troll はそこまで奇妙ではない。実際には短い夏の間はケープタウン時間を使い、それ以外の期間はノルウェー時間を使う
      ただしノルウェー時間がよりによって夏時間を採用している
    • うるう秒は概ね雑学だが、複数の当事者が時間の順序について正確に合意しなければならないアプリケーションでは決定的に重要になる。代表例が 金融取引
      多くの市場はうるう秒の間は閉場しており、多くの銀行はエラーのリスクを減らすため、現地時間の変更時には今でもすべての取引を停止する
      あまり気にしないアプリケーションでも、うるう秒関連のバグは驚くほど多く、CGPM がうるう秒の廃止を決定したのには十分な理由がある
      https://en.wikipedia.org/wiki/Leap_second#Other_reported_sof...
    • Troll を見に来た。私の知る限り、冬の夏時間 がある唯一の場所で、名前のおかげでさらにポイントが高い
  • タイムゾーンソフトウェアの曲芸を扱った素晴らしい記事。実にかなり柔軟だ。
    すべてが自動化された有限のオフセットであるなら、夏時間ポリシーが必ずしも60分調整に合わせる必要はない。
    どこかの国が1年を通して 連続的に変化するオフセット を使うことに決めることもあり得るのではないか? オフセット参照テーブルははるかに長くなるだろうが、こうすれば夏時間を「解決」できるかもしれない。少しずつ継続的に調整されるので、うるう秒のように気付かれないだろう。
    アナログ時計に頼っている人たちは、毎回同じ方向に調整する必要がなくなるかもしれない。

    • 電子機器の時計同期が一般的になって以来、6か月間は毎月第1日曜日に10分ずつ進め、残りの6か月間は毎月第1日曜日に10分ずつ戻そうと、耳を貸してくれる相手には誰にでも提案してきた。
      月1回の 10分変更 は適応しやすく、ほとんど気付かれず、見逃しても1時間ずれているほど大事にはならない。
    • その道を進むと、論理的な結論はタイムゾーンという概念そのものをなくして 現地太陽時 に戻ることだ。
    • 夏時間を「解決」する最も簡単な方法を無視している。
      夏時間をやめればいい。個人的には恒久的な夏時間より 恒久標準時 のほうが好みだが、年に2回時計を変えるのをやめられるなら受け入れられる。
    • インドは UTC+5:30 で夏時間を実施しておらず、世界と相互作用するときに興味深い。
      もちろん中国は、あれほど広いのにタイムゾーンが1つしかないことで有名で、国内的にも対外的にも興味深い状況を生んでいる。
    • 理論上は tzdb で表現できる。もちろん問題は起こすだろう。
      TZif データ形式に明示されていない非常に重要な前提は、現地時刻から UTC 時刻へ変換するとき、可能性が最大2つしかないということだ。
      多くのソフトウェアがこの前提に依存しており、たとえば java.time.LocalDateTime には withLaterOffsetAtOverlap() がある: https://docs.oracle.com/javase/8/docs/api/?java/time/LocalDa...
      これは、午前2:30が何を意味するのか曖昧なとき、可能な解が夏時間の前後の2つしかないと暗黙に仮定している。あるタイムゾーンが午前2時に1回後ろへ戻し、2:15にまた後ろへ戻すような形で3つ以上の解を作るなら、多くのものはそれを表現できない。
  • tz データベースで気に入っている点は、技術的には diff の diff だということだ。
    各タイムゾーンと UTC の差が歴史的にどう変化してきたかを保存しているので、diff^2 と見なせる。しかも tz データベース自体も更新を受けるので、そのコミットは diff の diff の diff、つまり diff^3 だ。
    さらに進められる。変更ログがあり、その変更ログが git に保存されているので、tz 変更ログへのコミットは UTC に対する変更一覧の変更一覧の変更一覧に対する変更、すなわち diff^4 だ。

    • UTC、さらに広くは時間測定そのものも diff だという点を忘れている。
    • diff の diff は単に diff が2つあるだけだ。diff の積ではない。
  • ほぼすべての日付/時刻は、実際には監視中の マッチング規則の集合 だというフレーミングが重要だと思う。
    マッチングがトリガーされるまでに何秒かかるかは推測できるが、実際に起こるまでは完全には確信できず、場合によってはそもそも正確には起こらないこともある。
    その次の半分は、「今から X 秒後に起こるはずだ」というデルタの推測を、「そのときあなたのタイムゾーンの時計は Y を表示しているはずだ」に戻す作業だ。
    どのタイムゾーンがイベントを制御しているのか、そしてどのタイムゾーンで表示されるのかを追跡し続けるのを忘れてはならない。
    [1] UTC の推定値は、うるう秒のぶんだけ前後に外れる可能性がある。TAI のほうが安全だが、誰かがセシウム原子の振る舞いを変える興味深く新しい何かを発見したら話は変わるかもしれない。
    [0] たとえば国が消滅してタイムゾーン自体がなくなることもあり得る。あるいは時計が 1:00 から 2:00 に飛んで、欠落した1時間のせいで 1:30〜2:00 の区間が正確には発生しないこともあり得る。