経過日数の計算

1582年10月15日からの経過秒を知りたくてプログラムを組んでみていたのですが、単純に算出ならRubyでさっくりといくことを知りました。@tmtmsさん、ありがとうございます。Rationalは分数を表現していて、第一引数を第二引数で割った値になります。

DateTimeを使うと日時で計算できます。日数だけ知りたい場合はDateを使います。

$ ruby -rdate -e 'p DateTime.new(2001,1,1,0,0,0) - DateTime.new(2000, 1, 1, 0, 0, 0)'
Rational(366, 1)
$ ruby -rdate -e 'p Date.new(2000,1,1) - Date.new(1999, 1, 1)'
Rational(365, 1)
$ ruby -rdate -e 'p Date.new(2001,1,1) - Date.new(2000, 1, 1)'
Rational(366, 1)

過去だとカレンダーを切り替えたりしたタイミングで失われる日があったりするのですが、西暦(グレゴリウス歴)では1582年10月15日から1970年1月1日までにそういうことは発生していないようなので、そのまま単純に指定しても良さそうです。Javaと比較をしたかったので、1000年足して、2582年10月15日から2970年1月1日までの日数を数えて見ました。

まずは、2582年1月1日から2970年1月1日まで調べると、次のとおり。

$ ruby -rdate -e 'p Date.new(2970,1,1) - Date.new(2582, 1, 1)'
Rational(141714, 1)

まずは、2582年10月15日から2970年1月1日まで調べると、次のとおり。

$ ruby -rdate -e 'p DateTime.new(2970,1,1,0,0,0) - DateTime.new(2582, 10, 15, 0, 0, 0)'
Rational(141427, 1)

カレンダーは計算だけではでないものもあり、閏秒とかも考慮したい時があるので、気をつけないといけませんが、単純計算だけなら、これで十分ですね。

同じタグの記事: Date
同じタグの記事: DateTime
同じタグの記事: Ruby
同じカテゴリの記事: Program
関連書籍: Ruby