ふなばです。

今のところ、こんな感じです (ドロドロです)。

基本的に、to_X->to_Y->to_X としても、同じ内容に戻ることは期待できませ
ん。

# じつは、DateTime<->Date では、完全に情報を保存することも可能ですが、
# そうしても却って混乱するだけだと思うので、あえて時刻情報は捨てます。
# Time<->Date でも、必ず零時になります。


to_time について

o 常に地方時モードになります。
o サマータイムや負の閏秒の影響などで、意図した時刻にならないかもしれな
  いけど、検査もしません。
o usec に収まらない端数は捨てられます。
o time_t で表現できない時刻は変換できないに違いありません。

Date は、便宜的に、内部では協定世界時零時で表され、DateTime との関係に
おいては、まさにそのように扱われますが、これは本来、匿名の地方時 (?)、
のようなものなので、変換の際にも地方時とみなします。


to_date/to_datetime について

o タイムゾーン情報は失なわれます。ただし、DateTime では、その時の時差
  は残ります。
o もし、あっても閏秒は考慮されない。正の閏秒があっても丸められます。


たぶん、他にも忘れてることがあります。一週間くらい寝かせると思います。
今のところ具体的には以下のような感じです。


class Time

  def to_time() getlocal end

  def to_date
    jd = Date.civil_to_jd(year, mon, mday, Date::ITALY)
    Date.new0(Date.jd_to_ajd(jd, 0, 0), 0, Date::ITALY)
  end

  def to_datetime
    jd = DateTime.civil_to_jd(year, mon, mday, DateTime::ITALY)
    fr = DateTime.time_to_day_fraction(hour, min, [sec, 59].min) +
	 usec.to_r/86400000000
    of = utc_offset.to_r/86400
    DateTime.new0(DateTime.jd_to_ajd(jd, fr, of), of, DateTime::ITALY)
  end

end

class Date

  def to_time() Time.local(year, mon, mday) end
  def to_date() self end
  def to_datetime() DateTime.new0(self.class.jd_to_ajd(jd, 0, 0), of, sg) end

  def self.today(sg=ITALY) Time.now.to_date.new_start(sg) end

end

class DateTime

  def to_time
    d = new_offset(0)
    d.instance_eval do
      Time.utc(year, mon, mday, hour, min, sec,
	       (sec_fraction * 86400000000).to_i)
    end.
	getlocal
  end

  def to_date() Date.new0(self.class.jd_to_ajd(jd, 0, 0), 0, sg) end
  def to_datetime() self end

  def self.now(sg=ITALY) Time.now.to_datetime.new_start(sg) end

end