🔭

宇宙からの地球観測第2章

2024/04/13に公開

宇宙からの地球観測 第2章の章末問題は一見すると単純な問題に見えます。
ただし、閏年、閏秒というものがはいってくると時間の深遠さを垣間見ることができます。

問題 2.1:

1970年1月1日0時0分0秒から起算するUNIX時間で100001秒経ったときのUTC時刻を求めなさい。また、10000001秒経つとUTC時刻は何になるか。

最初の問題は単純に割っていくだけですね。

def calcDate(time_delat):
  MIN_SEC = 60
  HOUR_SEC = 3600
  DAY_SEC = 86400
  day, sec = divmod(time_delat,DAY_SEC)
  hour, sec = divmod(sec,HOUR_SEC)
  min, sec = divmod(sec,MIN_SEC)
  print(f"{day}days, {hour}hours, {min}minutes, {sec}seconds")
  return day,hour,min, sec

calcDate(100001)
calcDate(10000001)
--
1days, 3hours, 46minutes, 41seconds
115days, 17hours, 46minutes, 41seconds

1970年1月1日に 上記をたせばよいだけなので 1970年1月2日 3:46 41秒 です
2つ目は 1970年の1月から3月のそれぞれの月の日数は
31,28,31 = 90 なので 残り25days 1970年4月26日 17:46 41秒ですね。
(3ヶ月の残り25日となったときに、4月25日なのか、26日なのか一瞬迷うのは何でですかね。)

問題 2.2:

2012年1月1日0時0分0秒から2012年12月31日23時59分59秒までの1年間の秒数を求めなさい。

この問題も単純なようにみえて、ひっかけがあります。2012年は閏年であり、さらに閏秒が挿入された年でもあるのです。
あと、地味に難しいのが日本語の問題なのですが「まで」というのが以下なのか未満なのか。GPT4に聞いてみると未満であってるようです。

Q:一般的には「まで」といったら未満を意味する?
A:はい、通常「まで」という言葉はその範囲の終点を含まないことを意味します。たとえば「0秒から1秒まで」と言った場合、0秒は含むが1秒は含まない、つまり0秒以上1秒未満の期間を指します。これは時間の区間に限らず、多くの文脈で同じように適用されます。しかし、文脈によっては「まで」が終点を含むこともあるため、常にそのニュアンスを確認することが重要です。

つまり 1分0秒から2分0秒までは60秒だけど、1分59秒までは59秒なんですよね。これは単純なようで結構間違えやすいです。実際、本書の回答も間違っていました。

まず閏年なので366日です。ということは単純に1日の秒数をかけると以下になります。
(59秒までなので-1 をしています。)

DAY_SEC = 86400
print(f"{DAY_SEC*366-1}sec")
--
31622399sec

これで良さそうなものですが、なんと2012年は閏秒が6/30 23:59:60秒として挿入されています。
これは一般のpython datetime ライブラリでも考慮されません。(下記は閏秒を考慮したら2が期待値です)

delta = datetime(2012,7,1,0,0) - datetime(2012,6,30,23,59,59)
print(delta.total_seconds())
--
1

なので、ChatGPTに聞いた場合も考慮されずに上記の31622399秒と回答していました。
正解は+1 をした 31622400秒です。 (本書の回答は31622401 となっていましたが、こっちのほうが正しいはず)

閏秒:leap seconds

さて、閏秒ですが今(2024年)まで27秒追加されています。
挿入された日は、23:59:59 => 23:59:60 => 00:00:00と1秒増えます。

12/31 6/30 累計回数
1972 1 1
1973 1 2
1974 1 3
1975 1 4
1976 1 5
1977 1 6
1978 1 7
1979 1 8
1980 1 9
1981 1 10
1982 1 11
1983 1 12
1985 1 13
1988 1 14
1990 1 15
1991 1 16
1992 1 17
1993 1 18
1994 1 19
1996 1 20
1997 1 21
1999 1 22
2006 1 23
2009 1 24
2012 1 25
2015 1 26
2017 1 27

2015年の時は私もリアルタイムでシステムがおかしな挙動にならないかを監視していた記憶があります。1970年代と違い、システムで時刻を扱う領域が多岐にわたり、時々60秒が存在するということを考慮しきれていないプログラムによる不具合が過去にも多発したという経緯から直近は閏秒が見送られています。そして2035年までには新しいUTCを導入するということが決まっているようです

https://www.itmedia.co.jp/news/articles/2402/29/news194.html

色々な時刻

第2章では時刻の考え方を説明しています。
地球は太陽のまわりをまわっているので、単純に太陽が真上から真上になったということを観測しても一周したとはならないんですね(太陽時)、、 厳密には遠いところにある恒星をみて同じ位置になる時間を計測することが正確な地球の一周の時刻となる(恒星時)。これをもとに 世界時間(UT: UniversalTime)になるということがよくわかりました。

名前 略称 説明
暦時 ET グレゴリオ暦(1582-現代までの主流),修正ユリウス日
太陽時・恒星時 地球の自転に基づく時間。太陽時は太陽の見かけの動き、恒星時は恒星の見かけの動きに基づく。
世界時:UniversalTime UT, UT1 遠方の恒星:クエーサー(quasai-steller objects)が特定の子午線を横切る時間を計測する時間。実際の地球の自転の変動を反映する。
原子時:AtomicTime AT 原子の特性を基にした非常に正確な時間尺度。
国際原子時:InternationalAtomicTime TAI 1967年の国際度量衡総会で1秒がセシウム133原子放射周期の9192631770倍
協定世界時 CoordinatedUniversalTime UTC UTとTAIを合成して作成、UTに対して誤差1秒未満になるよう国際的に調整され(これが閏秒)、世界共通の時間を提供する。
日本標準時 JST 日本で使用される標準時間。UTCに9時間を加えたもの。
GPS時 GPS衛星の基づく時間尺度。1980/1/6 0:0:0 のUTCを起点としてGPSWeek(604800秒)とGPSSecond であらわされる。閏秒はなし
Unix Time 1970年1月1日0時0分0秒からの経過秒数を数える時間尺度。

いままで、一日の長さは変わらないと信じてましたが、実は違うんですね。
地球の自転、公転、恒星、原子 といろいろないままでの物理の発見により、正しい時間がつくられている。人間って改めてすごいですね。

Discussion