ふなばです。

At 2001-01-02T01:39:37+0900 (2451911.19418JD),
ggb03124 / nifty.ne.jp (  =?ISO-2022-JP?B?GyRCJD8kMRsoQg==?=  (tk)) wrote:

> Time と Date についていくつか質問させてください。
> 
> 1 なぜ Time と Date があるのか?。Time の時刻部分がない物が Date では
> ないのか?。

んー、それはどうでしょう。

> Time は Unix Time をそのまま使っているようだが、プラットフォームの制約を
> 受け継ぐのは問題ではないか?。Fixnum と Bignum のように内部的に切り替え
> ることは出来ないか?。

その UNIX のライブラリでは、地方時 (と協定世界時) の表現を与えてくれま
すよね。時差や閏秒の挿入などのデータベースを持っています。それをどのよ
うに提供しましょう。

> time = Time.mktime(1970,1,1,9,0,0)	#	OK
> time = Time.mktime(1970,1,1,8,59,59)	#	NG
> 
> Date は内部的にユリウス日を使っているようだが、ユリウス日は本来は時刻ま
> で含んだ実数なので、Date と Time とは理論的には同じ物になるはず。

もともと時分秒は昼夜なり日なりを均等に分割したものだったと思いますが、
それだと秒の長さは決まらないわけで、あるときから秒は固定され、閏秒の挿
入もできたわけですよね。Time は基本的に秒で勘定しているわけで、いわれ
るようにはならないのではないか、ということは考えてみるべきかもしれません。

> * UnixTime クラス(内部的には整数?)、Date クラス(内部的にはユリウス
> 日の整数)、DateTime クラス(内部的にはユリウス日の実数)。で、統合クラ
> スとしての Time クラスは、 UnixTime の範囲内であればそれになり、範囲外な
> ら DateTime クラスになる。

ちなみに、date2 パッケージに date3.rb というものがあります。実験的なも
のですが、時刻もあらわせる Date です。タイムゾーンのデータベースを参照
することはありませんが、時差を与えることはできます。閏秒はムシ! date3 
は date2 と同じく、ユリウス日で勘定しますが、日を Rational で持ってま
す。

僕も Date や Time が完璧だとは思いませんが、うまい方法を知りません。と
もかく、Time を置き換えるための、あたらしい物を作るなら、タイムゾーン
についての課題なども克服したものを考えねばならないと思います。

> 2 Time から Date へ、またその逆の変換ルーティンは用意されているか?。

ないです。

> 3 Date#to_s で "yyyy-mm-dd" という形式の文字列が返るが、その逆変換( 
> "yyyy-mm-dd" の形式の文字列を Date 型に変換するメソッド)はあるか?。
> (parsedate はオーバースペックなので)。

parsedate でもいいと思うのですが、date[23] では、strptime.rb を持って
いますし、個人的には、そういう、やや特殊なものを用意する必要性は感じて
いません。Time では、Getdate モジュールというのもありますが。

> 次善の策として、次のような式が使えるようにならないか?。(配列を受け取る
> 物)。
> 
> time = Time.mktime(ParseDate.parsedate('1999-12-31'))	#	NG
> time = Date.new(ParseDate.parsedate('1999-12-31'))	#	NG

これやると、どうしてタイムゾーンが反映されないんだ、とか、いわれるかな。
ParseDate は、年なしの日付やら曜日だけのものでもあつかえるようになって
いるわけだし、タイムゾーンの解釈についても微妙だし、ParseDate の仕様に
引きずられるのもヘンな感じがします。

文字列から時刻、これは「変換」とみなされると思いますが、どうやっても、
失われる情報があるわけで、それをどう考えるべきでしょう。

> 4 Time で時刻部分をカットするメソッドはないのか?。

カットとは?

ふなば ただよし