From: Tadayoshi Funaba Date: 2004-09-11T00:02:35+09:00 Subject: [ruby-dev:24250] DateTime#to_time ふなばです。 今のところ、こんな感じです (ドロドロです)。 基本的に、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