#! /usr/local/bin/ruby# coding: utf-8#---------------------------------------------------------------------------------#= 地球自転速度の補正値 delta T(ΔT)の計算# : [NASA - Polynomial Expressions for Delta T](http://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html)# の計算式を使用する。# 1972年 - 2018年は、比較対象として「うるう年総和 + 32.184(TT - TAI)」の値も計算する。## date name version# 2016.06.15 mk-mode.com 1.00 新規作成# 2016.07.20 mk-mode.com 1.01 第27回うるう秒調整に関する判定を追加## Copyright(C) 2016 mk-mode.com All Rights Reserved.#---------------------------------------------------------------------------------# 引数 : YYYYMM# * YYYYMM は UTC# * 無指定なら現在年月を UTC とみなす。#---------------------------------------------------------------------------------#++require'date'classCalcDeltaTUSAGE="[USAGE] ./calc_delta_t.rb [[+-]YYYYMM]"MSG_ERR_1="[ERROR] Year must be between -1999 and 3000!"MSG_ERR_2="[ERROR] Month must be between 1 and 12!"TT_TAI=32.184definitializeym=ARGV.shiftym||=Time.now.strftime("%Y%m")unlessym=~/^[+-]?\d{6}$/putsUSAGEexit0end@year,@month=ym.scan(/([+-]?\d{4})(\d{2})/)[0].map(&:to_i)if@year<-1999||@year>3000putsMSG_ERR_1exit0endif@month<1||@month>12putsMSG_ERR_2exit0end@y=@year+(@month-0.5)/12enddefcalc# NASA Ver. (-1999 - 3000)casewhen@year<-500;dt=calc_before_m500when-500<=@year&&@year<500;dt=calc_before_500when500<=@year&&@year<1600;dt=calc_before_1600when1600<=@year&&@year<1700;dt=calc_before_1700when1700<=@year&&@year<1800;dt=calc_before_1800when1800<=@year&&@year<1860;dt=calc_before_1860when1860<=@year&&@year<1900;dt=calc_before_1900when1900<=@year&&@year<1920;dt=calc_before_1920when1920<=@year&&@year<1941;dt=calc_before_1941when1941<=@year&&@year<1961;dt=calc_before_1961when1961<=@year&&@year<1986;dt=calc_before_1986when1986<=@year&&@year<2005;dt=calc_before_2005when2005<=@year&&@year<2050;dt=calc_before_2050when2050<=@year&&@year<=2150;dt=calc_until_2150when2150<@year;dt=calc_after_2150endstr=sprintf("[%04d-%02d]",@year,@month)str<<" delta T = #{dt}"# NICT Ver. (1972-01-01 - 2018-12-31)if1972<=@year&&@year<=2018str<<" (NICT: #{calc_nict})"endputsstrrescue=>e$stderr.puts"[#{e.class}] #{e.message}"e.backtrace.each{|tr|$stderr.puts"\t#{tr}"}exit1endprivate# year < -500defcalc_before_m500t=(@y-1820)/100.0dt=-20+32*t**2returndtrescue=>eraiseend# -500 <= year && year < 500defcalc_before_500t=@y/100.0dt=10583.6+\(-1014.41+\(33.78311+\(-5.952053+\(-0.1798452+\(0.022174192+\(0.0090316521)\*t)*t)*t)*t)*t)*treturndtrescue=>eraiseend# 500 <= year && year < 1600defcalc_before_1600t=(@y-1000)/100.0dt=1574.2+\(-556.01+\(71.23472+\(0.319781+\(-0.8503463+\(-0.005050998+\(0.0083572073)\*t)*t)*t)*t)*t)*treturndtrescue=>eraiseend# 1600 <= year && year < 1700defcalc_before_1700t=@y-1600dt=120+\(-0.9808+\(-0.01532+\(1.0/7129.0)\*t)*t)*treturndtrescue=>eraiseend# 1700 <= year && year < 1800defcalc_before_1800t=@y-1700dt=8.83+\(0.1603+\(-0.0059285+\(0.00013336+\(-1.0/1174000.0)\*t)*t)*t)*treturndtrescue=>eraiseend# 1800 <= year && year < 1860defcalc_before_1860t=@y-1800dt=13.72+\(-0.332447+\(0.0068612+\(0.0041116+\(-0.00037436+\(0.0000121272+\(-0.0000001699+\(0.000000000875)\*t)*t)*t)*t)*t)*t)*treturndtrescue=>eraiseend# 1860 <= year && year < 1900defcalc_before_1900t=@y-1860dt=7.62+\(0.5737+\(-0.251754+\(0.01680668+\(-0.0004473624+\(1.0/233174.0)\*t)*t)*t)*t)*treturndtrescue=>eraiseend# 1900 <= year && year < 1920defcalc_before_1920t=@y-1900dt=-2.79+\(1.494119+\(-0.0598939+\(0.0061966+\(-0.000197)\*t)*t)*t)*treturndtrescue=>eraiseend# 1920 <= year && year < 1941defcalc_before_1941t=@y-1920dt=21.20+\(0.84493+\(-0.076100+\(0.0020936)\*t)*t)*treturndtrescue=>eraiseend# 1941 <= year && year < 1961defcalc_before_1961t=@y-1950dt=29.07+\(0.407+\(-1/233.0+\(1/2547.0)\*t)*t)*treturndtrescue=>eraiseend# 1961 <= year && year < 1986defcalc_before_1986t=@y-1975dt=45.45+\(1.067+\(-1/260.0+\(-1/718.0)\*t)*t)*treturndtrescue=>eraiseend# 1986 <= year && year < 2005defcalc_before_2005t=@y-2000dt=63.86+\(0.3345+\(-0.060374+\(0.0017275+\(0.000651814+\(0.00002373599)\*t)*t)*t)*t)*treturndtrescue=>eraiseend# 2005 <= year && year < 2050defcalc_before_2050t=@y-2000dt=62.92+\(0.32217+\(0.005589)\*t)*treturndtrescue=>eraiseend# 2050 <= year && year <= 2150defcalc_until_2150dt=-20\+32*((@y-1820)/100.0)**2-0.5628*(2150-@y)returndtrescue=>eraiseend# 2150 < yeardefcalc_after_2150t=(@y-1820)/100.0dt=-20+32*t**2returndtrescue=>eraiseend# NICT Ver. (1972-01-01 - 2017-12-31)defcalc_nictym=sprintf("%04d%02d",@year,@month)casewhenym<"197207";dt=TT_TAI+10whenym<"197301";dt=TT_TAI+11whenym<"197401";dt=TT_TAI+12whenym<"197501";dt=TT_TAI+13whenym<"197601";dt=TT_TAI+14whenym<"197701";dt=TT_TAI+15whenym<"197801";dt=TT_TAI+16whenym<"197901";dt=TT_TAI+17whenym<"198001";dt=TT_TAI+18whenym<"198107";dt=TT_TAI+19whenym<"198207";dt=TT_TAI+20whenym<"198307";dt=TT_TAI+21whenym<"198507";dt=TT_TAI+22whenym<"198801";dt=TT_TAI+23whenym<"199001";dt=TT_TAI+24whenym<"199101";dt=TT_TAI+25whenym<"199207";dt=TT_TAI+26whenym<"199307";dt=TT_TAI+27whenym<"199407";dt=TT_TAI+28whenym<"199601";dt=TT_TAI+29whenym<"199707";dt=TT_TAI+30whenym<"199901";dt=TT_TAI+31whenym<"200601";dt=TT_TAI+32whenym<"200901";dt=TT_TAI+33whenym<"201207";dt=TT_TAI+34whenym<"201507";dt=TT_TAI+35whenym<"201701";dt=TT_TAI+36whenym<"201901";dt=TT_TAI+37# <= 第28回うるう秒実施までの暫定措置endreturndtrescue=>eraiseendendCalcDeltaT.new.calcif__FILE__==$0