In article <20011204234521G.tadf / kt.rim.or.jp>,
  tadf / kt.rim.or.jp writes:

> newdate の紹介です。
> 
> newdate (仮) は、従来の date2 (lib/date.rb) と date3 をまとめたものです。
> 
> Date は基本的に従来のままです。あらたに作成した DateTime は Date に時
> 刻と時差を持たせたものです。

Date の中身を見ると(Rational を使わないことを除いて) DateTime と非常に
似通っているように思うんですが、二つに分ける意味はあるんでしょうか?

> DateTime.new(2001,2,19,12,13,14).to_s
> 	#=> "2001-02-19T12:13:14,0Z"
> 	DateTime では、時刻がつかえます。

小数点に , を使えるというのは知らなかったので驚いて、思わず図書室に
JIS X 0301 を確認しにいってしまいました。でも . でなく , を選んだ理由
はなんなんでしょう?

JIS X 0301 に載っている例は . ですし、XML Schema の dateTime も . 固定
ですし、とくに , を使う理由は思い当たらないんですが... もしかして (ISO
8601 に対する) JIS X 0301 拡張の年号の . と区別するため?

> DateTime.newp('Sat, 28 Aug 1999 02:29:34 +0200',
> 	      '%a, %d %b %Y %H:%M:%S %Z').to_s
> 	#=> "1999-08-28T02:29:34,0+0200"
> 	strptime(3) 風の解析もできます。
> 	クラスメソッド strptime をつかえば、解析のみもできます。

どちらかというと %Z じゃなくて %z なのではなかろうか... と思ったんです
が、本来の strptime にはどっちもないんですね。

> DateTime.now.strftime('%c')
> 	#=> "Tue Feb 20 00:52:46 2001"
> 	strftime(3) もつかえます。

Ruby から nl_langinfo が使えれば locale 依存な挙動も実現できるのに、と
か思ったことはありませんか? (私はあります。)

> Date.new(2001,2,11).nhol?
> 	#=> true
> 	国民の祝日の判定もできます。

以前思ったのですが、土曜の丑の日を判定できると鰻を食べるのに便利だと思
います。

あと、いくつか思ったことを書きます。
ざっと読んだだけなのであまり深い話はありません。

* メソッド名がわかりにくいと思う。

DateTime.newp
Date.os?
Date.ns?
Date.exist1?
Date.new1
Date.exist3?
Date.new3
Date.exist2?
Date.existw?
Date.neww
Date.newp
Date#fr2
Date#os?
Date#ns?
Date#sg
Date#of
Date#nhol?
DateTime.existt?

など、てきとうにあげましたが、積極的な省略と、番号のついた名前がわかり
にくさを助長しているように思えます。

少なくとも外部インターフェースはもうちょっと長い名前を使ったほうがいい
んじゃないでしょうか。あるいは、せめてなんの略かの対応表が欲しいです。

* Date.neww のデフォルトが他と違う。

% ruby -I. -rdate -e 'p Date.neww.to_s'
"1582-10-15"
% ruby -I. -rdate -e 'p Date.new1.to_s'
"-4712-01-01"
% ruby -I. -rdate -e 'p Date.new2.to_s'
"-4712-01-01"
% ruby -I. -rdate -e 'p Date.new3.to_s'
"-4712-01-01"

* DateTime.neww のデフォルトが invalid date になる。

% ruby -I. -rdate -e 'p DateTime.neww'     
./date.rb:487:in `neww': invalid date (ArgumentError)
        from -e:1

* julian_leap?, gregorian_leap? ときたら、herschel, greek, spawar も欲
  しくなる。(というような奇特な人は私くらいのものかも知れない。)
http://www.examsky.com/jglossl.html

* (とくに DateTime で) === が時分秒を考慮しない比較なのは意図した挙動
  なんでしょうか?

% ruby -I. -rdate -e 'p DateTime.new === (DateTime.new + 0.1)'
true

* (同様に等価性に関する疑問として) Date#hash は @rjd.hash ではまずいん
  でしょうか?

* ユリウス暦からグレゴリオ暦へ改暦するというヨーロッパ的視点が強いと感
  じる。

まぁ、ユリウス日をもとにした実装としては妥当なところという気もしますが、
もしかしたら、Java で java.util.Calendar という抽象基底クラスと
java.util.GregorianCalendar というグレゴリオ暦をあらわすクラスが別になっ
ているように、分けるという案もあるかも知れません。

* Date#>> は改暦を十分に未来にとると、そのあたりで無限ループをおこせそ
  うな気がする。(改暦で一ヶ月以上飛んで、翌月が存在しない場合。)

* Date#step は step が 0 だと無限ループ?

* DateTime.now は夏時間の境で問題が出るんじゃないでしょうか。

    i = Time.now
    a = i.to_a[0..5].reverse
    if a[-1] == 60 then a[-1] -= 1 end
    d = Time.gm(*a).to_i - Time.local(*a).to_i

Time.local(*a) というのはとり得る値がふたつあることがあるので危険です。
i.to_i とするほうがいいと思います。

* DateTime.existt? はなぜ h, min, s が負の場合に += するんでしょうか?

また、
    return unless (0..29) === h and
の 29 はおそらく 23 の間違いだと思います。

* DateTime#to_s の結果が小数点以下 1桁固定なのは奇妙な感じがします。

まぁ、循環小数になることもあるので固定にしないとしたらどこまで出すかは
難しいところですが。

* 意図的かどうかは判断がつかないんですが militaly zone が RFC 822 の間
  違いのままになっています。

* date/format.rb でパターンに不必要な o がついています。

* strftime の P2, ID, AR, TZ, GL というコメントはなんなんでしょう?

P2 は POSIX 2 で、TZ は tzcode かなぁ、という気もしますが他は想像がつ
きません。

* strptime で %d, %e はなぜ先頭空白を許すのでしょうか?

あと、世紀があって、かつ、4桁の年があると変になりそうです。
そういう変な状況において C の strptime がどういう挙動をするのかは知り
ませんが...

* Regexp.new('\\A' + Regexp.quote(c)) というのは持って回った書き方な気
  がします。

以前からなんとなく思っていたんですが、Java の String クラスにある
startsWith と endsWith 相当のメソッドが Ruby にもあると便利だと思いま
すね。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)