天文計算に関わる各種時刻系
TDBという時刻系がなんなのかを調べ始め、整理したメモです。TDBまで遠かった・・・。前日の記事に引き続き、時刻に関する記事です。
- 視太陽時、apparent solar time
- 日時計
- 太陽が真南(南半球ならば真北)を通過する瞬間を正午とする時刻
- 経度によって違う
- 地球が楕円軌道を公転しているのと地軸が公転軌道から傾いているため、時間の進み方は1年間の周期で大きな変動がある
- → 均時差
- 平均太陽時、mean solar time
- 視太陽時から1年周期の変動を除いた時刻
- それでも、地球の自転速度が一定でないため、1秒の長さが一定でない
- 経度によって違う
- 視太陽時から1年周期の変動を除いた時刻
- GMT (グリニッジ標準時、Greenwich Mean Time)
- UT0 (世界時、Universal Time)
- 恒星を観測して地球の自転を測定し決められる時刻
- 地球の自転速度が一定でないため、1秒の長さが一定でない
- 地球の極運動により厳密には地域により時刻にずれがある
- UT1 (世界時、Universal Time)
- UT0から地球の極運動を補正し、地域によらず統一した時刻
- UT2 (世界時、Universal Time)
- UT1からさらに年周期・半年周期の変動を除外して、よりなめらかにした時刻
- 1秒の長さをできるだけ一定にしたかったのだろうが、いまはTAIやUTCがあるので不要
- TT (地球時、Terrestrial Time)
- UT0/1/2の時間の進み方が一定でない問題を解決するために考えられた時刻
- 地球の自転速度との同期はあきらめる
- 地球の自転とは少しずつずれていく
- TAIの目的と一致するため、いまではTAIから逆算して計算する
- UT0/1/2の時間の進み方が一定でない問題を解決するために考えられた時刻
- TAI (国際原子時、International Atomic Time)
- UTC (協定世界時、Coordinated Universal Time)
- TCG (地心座標時、Geocentric Coordinate Time)
- 地球表面での地球重力の影響を除外した秒の定義を刻む時刻
- 地心(地球の重心)は地球の重力がない
- 太陽の重力の影響は残る
- TTやTAIより少し速く時間が進み、1年あたり約22ms進む
- TTやTAIから線形変換で計算できる
- 1977年1月1日0時0分32.184秒TTが起点
- 起点ではTTとTCGが一致
- 地球表面での地球重力の影響を除外した秒の定義を刻む時刻
- TCB (太陽系座標時、Barycentric Coordinate Time)
- TDB (太陽系力学時、Barycentric Dynamical Time)
- TCBから線形変換でき、かつ長期的に時間の進む速度をTTやTAIと同じにした時刻
- TTとのずれはTCGとTCBのずれの周期項のみが残るが、最大でも2ms程度
各種時刻系を変換するプログラム
以下のブログの方がこれらの時刻系を変換をするRuby Gemを作成されていました。これを呼び出すだけでできます。
Ruby - 各種時刻系の換算! - mk-mode BLOG
試してみます。
Gemfile
source "https://rubygems.org" gem 'mk_time'
sample.rb
require 'time' require 'mk_time' def output(time) t = MkTime::Calc.new(time) puts "UTC: #{time2str(t.utc)}" puts "JST: #{time2str(t.jst)}" puts "TAI: #{time2str(t.tai)}" puts "UT1: #{time2str(t.ut1)}" puts " TT: #{time2str(t.tt)}" puts "TCG: #{time2str(t.tcg)}" puts "TCB: #{time2str(t.tcb)}" puts "TDB: #{time2str(t.tdb)}" puts end def time2str(time) time.instance_eval {'%s.%03d' % [strftime('%Y-%m-%d %H:%M:%S'), (usec / 1000.0).round]} end output(Time.parse("2020-07-01T00:00:00.000+00:00")) output(Time.parse("1976-12-31T23:59:45.000+00:00"))
ライブラリインストールと実行。
$ bundle install $ bundle exec ruby sample.rb
以下は出力にコメントを書き足したものです。
# 2020年7月1日0時UTC UTC: 2020-07-01 00:00:00.000 JST: 2020-07-01 09:00:00.000 TAI: 2020-07-01 00:00:37.000 UT1: 2020-06-30 23:59:59.800 TT: 2020-07-01 00:01:09.184 TCG: 2020-07-01 00:01:10.141 TCB: 2020-07-01 00:01:30.467 TDB: 2020-07-01 00:01:09.184 # 1977年1月1日0時TAI # このときは TT, TCG, TCBが一致する UTC: 1976-12-31 23:59:45.000 JST: 1977-01-01 08:59:45.000 TAI: 1977-01-01 00:00:00.000 UT1: 1976-12-31 23:59:45.000 TT: 1977-01-01 00:00:32.184 TCG: 1977-01-01 00:00:32.184 TCB: 1977-01-01 00:00:32.184 TDB: 1977-01-01 00:00:32.184
TTとTDBの差の周期項は実装されていないようですが誤差は2ms以内です。
上記サンプルを確認したバージョン情報です。
$ ruby --version ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux] $ bundle list Gems included by the bundle: * mk_time (0.4.0)