さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

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の誤差)