天文計算に関わる各種時刻系

TDBという時刻系がなんなのかを調べ始め、整理したメモです。TDBまで遠かった・・・。前日の記事に引き続き、時刻に関する記事です。

  • 視太陽時、apparent solar time
    • 日時計
    • 太陽が真南(南半球ならば真北)を通過する瞬間を正午とする時刻
    • 経度によって違う
    • 地球が楕円軌道を公転しているのと地軸が公転軌道から傾いているため、時間の進み方は1年間の周期で大きな変動がある
      • → 均時差
  • 平均太陽時、mean solar time
    • 視太陽時から1年周期の変動を除いた時刻
      • それでも、地球の自転速度が一定でないため、1秒の長さが一定でない
    • 経度によって違う
  • GMT (グリニッジ標準時Greenwich Mean Time)
    • グリニッジ子午線における平均太陽時
    • 地球上の場所によらず同じ時間を刻めるようになる
    • いまではGMTをUT1またはUTCの意味で使われることがある
  • UT0 (世界時、Universal Time)
    • 恒星を観測して地球の自転を測定し決められる時刻
    • 地球の自転速度が一定でないため、1秒の長さが一定でない
    • 地球の極運動により厳密には地域により時刻にずれがある
  • UT1 (世界時、Universal Time)
    • UT0から地球の極運動を補正し、地域によらず統一した時刻
  • UT2 (世界時、Universal Time)
    • UT1からさらに年周期・半年周期の変動を除外して、よりなめらかにした時刻
    • 1秒の長さをできるだけ一定にしたかったのだろうが、いまはTAIやUTCがあるので不要
  • TT (地球時、Terrestrial Time)
    • UT0/1/2の時間の進み方が一定でない問題を解決するために考えられた時刻
      • 地球の自転速度との同期はあきらめる
    • 地球の自転とは少しずつずれていく
      • TAIの目的と一致するため、いまではTAIから逆算して計算する
  • TAI (国際原子時、International Atomic Time)
    • 地球表面(標高0m)におけるセシウム原子核による秒の定義を刻む時刻
      • 一般相対性理論により標高によって時間の進み方が違うために、標高0mと決められている
    • 1958年1月1日0時UT2が起点
      • TTよりも32.184秒遅れている
        • 起点時刻でのTTとUT2の差がその値だった
  • UTC (協定世界時Coordinated Universal Time)
    • 普段の日常生活やITの世界でも一番なじみのある時刻系
    • TAIと同じ秒の定義を刻み続ける
    • 地球の自転速度と同期させるため、ときどきうるう秒の調整が入る
      • UT1との時間差が0.9秒以内になるようにうるう秒が決定される
      • TAIとの差はうるう秒のみが起因で、整数秒のずれとなる
    • これに9時間進めたのが日本標準時
      • 各地の標準時は平均太陽時に近くなるようにUTCとの時差を定めている
  • TCG (地心座標時、Geocentric Coordinate Time)
    • 地球表面での地球重力の影響を除外した秒の定義を刻む時刻
      • 地心(地球の重心)は地球の重力がない
      • 太陽の重力の影響は残る
    • TTやTAIより少し速く時間が進み、1年あたり約22ms進む
    • TTやTAIから線形変換で計算できる
    • 1977年1月1日0時0分32.184秒TTが起点
      • 起点ではTTとTCGが一致
  • TCB (太陽系座標時、Barycentric Coordinate Time)
    • TCGからさらに太陽の重力の影響を除外した秒の定義を刻む時刻
    • TTやTAIより少し速く時間が進み、1年あたり約490ms進む
    • 地球が楕円軌道を公転しており、地球での太陽の重力は1年周期の変動があるため、TTやTAIやTCGとは線形変換できない
    • 1977年1月1日0時0分32.184秒TTが起点
      • 起点ではTTとTCGが一致
  • 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)