たけ(tk)です。

Tadayoshi Funaba さん曰く。
》ふなばです。

 早速ありがとうございます。

 もともと、なんでこのような質問をしたかというと、データベースに入ってい
る DateTime 型のデータを Ruby に翻訳しようと思ったら、Time も Date も使
えなかった、ということなのです。それはそれとして・・。

》> 1 なぜ Time と Date があるのか?。Time の時刻部分がない物が Date では> ないのか?。
》
》んー、それはどうでしょう。> 4 Time で時刻部分をカットするメソッドはないのか?。
》
》カットとは?

 どうでしょう?。理論的には分かりませんが Delphi の DateTime 型のデフォ
ルトの文字列表現(DateTimeToStr)では、時刻部分が 00:00:00 のときには 
ymd だけを文字列にするようになっています。これだと24時間のうち1秒ほど
困った表現になりますが、普通は日付型として扱いたい場合には時刻部分をカッ
トしておけば(=00:00:00 にすれば)日付しか出なくなるので便利なわけです。

Date3 で「日付」だけを扱いたいときには便利ではなかろうか?。

date.to_s
#	(Date2)	"2000-12-31"
# 	(Date3)	"2000-12-31T12:00:00,0Z"

》ちなみに、date2 パッケージに date3.rb というものがあります。実験的なものですが、時刻もあらわせる Date です。

 これが進化すれば Time の置き換えに使えそうですね。

》parsedate でもいいと思うのですが、date[23] では、strptime.rb を持っていますし、

 Date#strftime も使えるんですね。知らなかった。

手順:
(1) date2.2.2 をダウンロードして解凍。
(2) strftime.rb をライブラリパスにコピー
(3) require "strftime" を追加。

strptime の方は 

p Date.strptime( '2000-12-31' ) # nil

では駄目で、書式を指定しなければならないんですね。

p Date.strptime( '2000-12-31' , '%F' )	# {:mday=>31, :mon=>12, :year=>2000}

それと、Hash を返すだけで Date オブジェクトは作られない。さらに、その 
Hash を Date.new に送っても作ってくれない?。

p Date.new(Date.strptime( '2000-12-31' , '%F' ))	#	NG

−−

* バグめっけ。

p Date.strptime( '2000/12/31' , '%y/%m/%d' )	
#	{:mday=>31,:mon=>12, :year=>3900}

p Date.strptime( '12/31/2000' , '%D' )	
#	{:year=>3900, :mday=>31,:mon=>12}

−−

》> time = Time.mktime(ParseDate.parsedate('1999-12-31'))	#	NG> time = Date.new(ParseDate.parsedate('1999-12-31'))	#	NG
》
》これやると、どうしてタイムゾーンが反映されないんだ、とか、いわれるかな。

 しかし、Date.new( 1999, 12, 31)が既に出来るのだから、変わらないのでは?。

 Date.new の改造のつもり。

  def new_date ymd , *args
    if ymd.is_a? String
      case ymd
      when /(\d+)\D+(\d+)\D+(\d+)/
        return Date.new( $1.to_i , $2.to_i , $3.to_i )
      end
    end
    Date.new ymd , *args
  end

p new_date( '2000年12月31日' ).to_s	
p new_date( '2000 12 31' ).to_s	
p new_date( '2000.12.31' ).to_s
p new_date( '2000/12/31' ).to_s
p new_date( '2000-12-31' ).to_s
p new_date( 2000,12,31 ).to_s

PS.

》ggb03124 / nifty.ne.jp (  =?ISO-2022-JP?B?GyRCJD8kMRsoQg==?=  (tk)) wrote:
										↑
 Becky! で送信もとIDを変える方法が分からない。

PS2.

 ライブラリで日本語が使えないのは痛いですね・・。

PS3.

 Delphi では、ShortDateFormat(='yy/MM/dd'), LongTimeFormat(=
'hh:mm:ss')というグローバル変数があって、これを変えておくとデフォルトの
文字列変換ルーティン(to_s 相当)の変換方式を変えることが出来る。また、
プログラムの開始前にプラットフォームを調べて、このグローバル変数を変えて
いる。

 c:\progra~1\borland\delphi5\source\rtl\sys\sysutils.pas

たけ(tk) ggb03124 / nifty.ne.jp
http://member.nifty.ne.jp/take_tk