rubyでjulian day
Rubyは日付を扱う手段が大きく3種類用意されている。
# 見落としがあるかもしれないが
- Time
時刻を表すオブジェクト
- Date
日付をあらわすオブジェクト
- DateTime
日付と時間を表すことが出来るオブジェクト
Time以外のDate、DateTimeを利用する場合には、require "date"する必要がある。
これらを適宜使い分けておけば困らない。
RubyとSQLite3を組み合わせて使う場合には注意が必要である。
SQLiteには日付オブジェクトの概念が無い。
そのため、julian dayで格納する必要がある。
julian dayを利用できるオブジェクトは
- Date
- DateTime
この2つのみである。
時間まで扱いたい場合にはDateTimeを使うことになる。
このため実質DateTimeしか選択肢がない。
しかし問題がある
require 'date' time = DateTime.new(2009,12,12,12,12,0,Rational(9,24)) print time printf "\n" hoge = DateTime::jd(time.ajd.to_f) hoge = hoge.new_offset(Rational(9, 24)) print hoge
これを実行してみると
2009-12-12T12:12:00+09:00 2009-12-12T00:11:59+09:00
なんたるちあ!
どうも出力と入力でおかしくなる場合がある。
というか片方が修正jd使ってるみたいですね。
しかたがないので、0.5をたして対処。
require 'date' time = DateTime.new(2009,12,12,12,12,0,Rational(9,24)) print time printf "\n" hoge = DateTime::jd(time.ajd.to_f+0.5) hoge = hoge.new_offset(Rational(9, 24)) print hoge
こうしておくとOK
2009-12-12T12:12:00+09:00 2009-12-12T12:11:59+09:00
1分くらいずれるけど、これは仕方が無い。(Rationalの誤差)