From: "NARUSE, Yui" Date: 2009-03-30T02:32:11+09:00 Subject: [ruby-dev:38206] Re: big time 成瀬です。 Tanaka Akira wrote: > In article <49CDF29D.3010302@airemix.jp>, > "NARUSE, Yui" writes: > >> これはDateTime#next_dayのようなものを追加するのはどうでしょう。 > > まぁ、考えなくもないのですが、いつもそれは > > * 24時間後 > > * 次の日の同じ時刻 > > のどちらなのか、 とりあえず長いものの様子を見てみると、 PostgreSQLは24時間後 (24*60*60秒後) ですね。 なお、閏秒だと24時間後が同じ日になりうるんですが、 以下のように閏秒を次の日の00秒を2回という方法で実装していました。 まぁ、同じ日だったらもう1秒加えるのが正解な気がしますけど。 postgres=# SELECT ((timestamp '1972-06-30 23:59:59' AT TIME ZONE 'right/UTC' + INTERVAL '0 year 0 seconds') AT TIME ZONE 'right/UTC'); timezone --------------------- 1972-06-30 23:59:59 (1 row) postgres=# SELECT ((timestamp '1972-06-30 23:59:59' AT TIME ZONE 'right/UTC' + INTERVAL '0 year 1 seconds') AT TIME ZONE 'right/UTC'); timezone --------------------- 1972-07-01 00:00:00 (1 row) postgres=# SELECT ((timestamp '1972-06-30 23:59:59' AT TIME ZONE 'right/UTC' + INTERVAL '0 year 2 seconds') AT TIME ZONE 'right/UTC'); timezone --------------------- 1972-07-01 00:00:00 (1 row) また、XML Schemaを見ると一応1日後になっているのですが、 http://www.w3.org/TR/xmlschema-2/#adding-durations-to-dateTimes http://www.w3.org/TR/xmlschema11-2/#d0e29708 内部処理はUTC or local (というかタイムゾーン不定というべきか)でかつ、 閏秒は処理系依存(1.1では無視と規定)という仕様なので、 24時間後と変わりませんね。 なお、みんな大好きActiveSupportももちろん24*60*60秒後で、 閏秒には非対応に見えます。 ところで、ふと気づいたのですが、今のパッチだと > Time.utc(-1,1,1,0,0,0)+60*60*24*(365+58) => 0-02-28 00:00:00 UTC > Time.utc(-1,1,1,0,0,0)+60*60*24*(365+59) => 0-03-01 00:00:00 UTC こうなるんですが、0年(=BC 1年)って閏年じゃないですかね。 原因は、必要以上に1900を加えている部分があるからのようです。 -- NARUSE, Yui