Ruby - うるう秒実施一覧・DUT1一覧の取得(NICT 版)!

Updated:


NICT - 日本標準時プロジェクトで公開されている「うるう秒実施一覧」と「DUT1 一覧」を Ruby で取得してみました。

単純に HTML を取得して Nokogiri で解析しているだけです。

うるう秒や DUT1 に変更があった際に自作カレンダー関連のツールに容易に組み込めるように、と作成した次第です。

0. 前提条件

1. Ruby スクリプトの作成

File: get_leapsec_nict.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#! /usr/local/bin/ruby
# coding: utf-8
#---------------------------------------------------------------------------------
#= Ruby script to get a list of leap-second adjustment.
#
#  date          name            version
#  2016.07.25    mk-mode         1.00 新規作成
#
#  Copyright(C) 2016 mk-mode.com All Rights Reserved.
#---------------------------------------------------------------------------------
#
require 'kconv'
require 'nokogiri'
require 'open-uri'

class GetLeapcecNict
  URL = "http://jjy.nict.go.jp/QandA/data/leapsec.html"
  UA  = "mk-mode Bot (by Ruby/#{RUBY_VERSION}, Administrator: postmaster@mk-mode.com)"

  def exec
    leapsecs = [[0, 1972, 1, 1, -10]]

    begin
      html = open(URL, "r:sjis", {"User-Agent" => UA}) { |f| f.read }.toutf8
      doc = Nokogiri::HTML.parse(html)
      doc.xpath("//pre").text.split("\n").each do |line|
        l = line.scan(/[\s ]+(.+?)[\s ]+(.+?)[\s ]*年[\s ]*(.+?)[\s ]*月[\s ]*(.+?)[\s ]*日.+?秒[\s ]*(.+?)[\s ]*秒$/)[0]
        next unless l
        leapsecs << l.map { |a| NKF::nkf("-WwZ1", a).to_i }
      end
      p leapsecs.sort
    rescue => e
      msg = "[#{e.class}] #{e.message}\n"
      msg << e.backtrace.map { |tr| "\t#{tr}\n" }.join("\n")
      $stderr.puts msg
    end
  end
end

GetLeapcecNict.new.exec if __FILE__ == $0

File: get_dut1_nict.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#! /usr/local/bin/ruby
# coding: utf-8
#---------------------------------------------------------------------------------
#= Ruby script to get a list of DUT1 adjustment.
#
#  date          name            version
#  2016.07.25    mk-mode         1.00 新規作成
#
#  Copyright(C) 2016 mk-mode.com All Rights Reserved.
#---------------------------------------------------------------------------------
#
require 'kconv'
require 'nokogiri'
require 'open-uri'

class GetDut1Nict
  URL = "http://jjy.nict.go.jp/QandA/data/dut1.html"
  UA  = "mk-mode Bot (by Ruby/#{RUBY_VERSION}, Administrator: postmaster@mk-mode.com)"

  def exec
    dut1s = Array.new

    begin
      html = open(URL, "r:sjis", {"User-Agent" => UA}) { |f| f.read }.toutf8
      doc = Nokogiri::HTML.parse(html)
      doc.xpath("//pre").text.split("\n").each do |line|
        l = line.scan(/(.+?)年 ?(.+?)月(.+?)日 0900 JST から(.+?)秒$/)[0]
        next unless l
        dut1s << (l[0,3].map { |a| NKF::nkf("-WwZ1", a).to_i } << NKF::nkf("-WwZ1", l[-1]).to_f)
      end
      p dut1s.sort
    rescue => e
      msg = "[#{e.class}] #{e.message}\n"
      msg << e.backtrace.map { |tr| "\t#{tr}\n" }.join("\n")
      $stderr.puts msg
    end
  end
end

GetDut1Nict.new.exec if __FILE__ == $0

2. Ruby スクリプトの実行

$ ./get_leapsec_nict.rb
[[0, 1972, 1, 1, -10],
 [1, 1972, 7, 1, -11],
 [2, 1973, 1, 1, -12],
 [3, 1974, 1, 1, -13],
 [4, 1975, 1, 1, -14],
 [5, 1976, 1, 1, -15],
 [6, 1977, 1, 1, -16],
 [7, 1978, 1, 1, -17],
 [8, 1979, 1, 1, -18],
 [9, 1980, 1, 1, -19],
 [10, 1981, 7, 1, -20],
 [11, 1982, 7, 1, -21],
 [12, 1983, 7, 1, -22],
 [13, 1985, 7, 1, -23],
 [14, 1988, 1, 1, -24],
 [15, 1990, 1, 1, -25],
 [16, 1991, 1, 1, -26],
 [17, 1992, 7, 1, -27],
 [18, 1993, 7, 1, -28],
 [19, 1994, 7, 1, -29],
 [20, 1996, 1, 1, -30],
 [21, 1997, 7, 1, -31],
 [22, 1999, 1, 1, -32],
 [23, 2006, 1, 1, -33],
 [24, 2009, 1, 1, -34],
 [25, 2012, 7, 1, -35],
 [26, 2015, 7, 1, -36],
 [27, 2017, 1, 1, -37]]

$ ./get_dut1_nict.rb
[[1988, 3, 17, 0.2],
 [1988, 5, 12, 0.1],
 [1988, 8, 25, 0.0],
 [1988, 11, 10, -0.1],
 [1989, 1, 19, -0.2],
 [1989, 4, 6, -0.3],
 [1989, 6, 8, -0.4],
 [1989, 9, 21, -0.5],
 [1989, 11, 16, -0.6],
 [1990, 1, 1, 0.3],
 [1990, 3, 1, 0.2],
 [1990, 4, 12, 0.1],
 [1990, 5, 10, 0.0],
 [1990, 7, 26, -0.1],
 [1990, 9, 20, -0.2],
 [1990, 11, 1, -0.3],
       :
 ===< 中略 >===
       :
 [2013, 4, 11, 0.1],
 [2013, 8, 22, 0.0],
 [2013, 11, 21, -0.1],
 [2014, 2, 20, -0.2],
 [2014, 5, 8, -0.3],
 [2014, 9, 25, -0.4],
 [2014, 12, 25, -0.5],
 [2015, 3, 19, -0.6],
 [2015, 5, 28, -0.7],
 [2015, 7, 1, 0.3],
 [2015, 9, 17, 0.2],
 [2015, 11, 26, 0.1],
 [2016, 1, 31, 0.0],
 [2016, 3, 24, -0.1],
 [2016, 5, 19, -0.2]]

3. 参考サイト


NASA 版の計算式では細かい補正が行われてはいますが、当方は、うるう秒挿入(or 削除)が確実な場合は「うるう秒挿入(or 削除)総和 + 32.184(TT - TAI)」を \(\Delta T\) とするようにしています。

以上。





 

Sponsored Link

 

Comments