Hatena::Grouprubyist

Ruby初心者prinyの学習帳 RSSフィード

2009-02-02たのしいRuby P.313 (1)

「"2001年12月23日午後8時17分50秒"」といったように、「年・月・日・時・分・秒」を
使った時刻の文字列を Time オブジェクトに変換して返すメソッド jparsedate を定義しましょう。

Time.parse の仕様を参考にして、以下のようなメソッドをつくろう。

  • 与えられた文字列に時刻の上位の要素がなかったら、now の要素が使われる。
  • 与えられた文字列に時刻の下位の要素がなかったら、最小値( 1 か 0 )が使われる。
  • 「午後○時」だったら、12 を足して 24 時間表示にする。

書いたもの

$KCODE = "SJIS"

def jparsedate(str)
  now = Time.now
  year = now.year
  month = now.month
  day = now.day
  hour = now.hour
  min = now.min
  sec = 0

  str.scan(/([午前|午後]*)?(\d*)([年|月|日|時|分|秒])/){
    case $3
    when ""
      year = $2
      month, day, hour, min = 1, 1, 0, 0
    when ""
      month = $2
      day, hour, min = 1, 0, 0
    when ""
      day = $2
      hour, min = 0, 0
    when ""
      if $1 == "午後"
        hour = $2.to_i + 12
      else
        hour = $2
      end
      min = 0
    when ""
      min = $2
    when ""
      sec = $2
    end
  }
  Time.mktime(year, month, day, hour, min, sec)
end

p jparsedate("2001年12月23日午後8時17分50秒")
p jparsedate("01年12月23日午前8時50秒")
p jparsedate("12月23日午後10時")
p jparsedate("2001年12月")
p jparsedate("8時17分50秒")
p jparsedate("50秒")

実行結果

Sun Dec 23 20:17:50 +0900 2001
Sun Dec 23 08:00:50 +0900 2001
Wed Dec 23 22:00:00 +0900 2009
Sat Dec 01 00:00:00 +0900 2001
Mon Feb 02 08:17:50 +0900 2009
Mon Feb 02 21:55:50 +0900 2009

エクセルだと、「21時20分」とか「7時23分45秒」とかは時刻として認識されるけど、「8時」とか「8時50秒」とか「3分20秒」とかは文字列として認識されるらしいのよね。「50秒」みたいのまで時刻として受け入れるのは、ゆるふわすぎかな?どうしよう。

似たようなことを書いていて冗長なのが気に入らない。何とかしたいのに、ジグソーパズルでこっちのピースを入れたら、あっちのピースが外れてたみたいなかんじになって、妙案が浮かばない。ブレイクスルーしたい。

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/priny/20090202