今日は満月?

久しぶりにRubyあれこれのソースを写経しながら,Rubyの勉強をしました.
今回写経したのは,今日は満月?という名前の,素敵なスクリプト.序盤のMoonクラスは,やたら数式やら計算だらけで,こりゃRuby関係無さそうなのでコピペ.


それでは本題に入ります.ちょっと気になってリファレンスを引いた所.

Time

ソースの,だいたい70-80行目ぐらいで,

require 'time'
begin
  t = Time.parse(opt_str)

とし,timeというライブラリを読み込んでいます*1.次に,beginのブロックの中でparseメソッドでもって,文字列(ここでは,opt_str)をパースし,Timeオブジェクトに変換しています.
そして気になった処理というのは,

opt_str = t.strftime('%x %X ')

なんかもう,暗号!とりあえず,strftimeをリファレンスで引いてみると,

strftime(format)
時刻を format 文字列に従って文字列に変換した結果を返します。 format 文字列として指定できるものは 以下の通りです。

  • %A: 曜日の名称(Sunday, Monday ... )
  • %a: 曜日の省略名(Sun, Mon ... )
  • %B: 月の名称(January, February ... )
  • %b: 月の省略名(Jan, Feb ... )
  • %c: 日付と時刻
  • %d: 日(01-31)
  • %H: 24時間制の時(00-23)
  • %I: 12時間制の時(01-12)
  • %j: 年中の通算日(001-366)
  • %M: 分(00-59)
  • %m: 月を表す数字(01-12)
  • %p: 午前または午後(AM,PM)
  • %S: 秒(00-60) (60はうるう秒)
  • %U: 週を表す数。最初の日曜日が第1週の始まり(00-53)
  • %W: 週を表す数。最初の月曜日が第1週の始まり(00-53)
  • %w: 曜日を表す数。日曜日が0(0-6)
  • %X: 時刻
  • %x: 日付
  • %Y: 西暦を表す数
  • %y: 西暦の下2桁(00-99)
  • %Z: タイムゾーン trap
  • %%: %自身

プログラミング言語 Ruby リファレンスマニュアルより引用
ほう,なるほど.このリストに依ると,%xは日付,%Xは時刻という事だな.
じゃぁ,

puts Time.now.strftime('今は%I時%M分だね')

なんてすると,「今は11時23分だね」と表示してくれるんだな.解決.ちなみに,日付・時刻に関するライブラリは,date,timeの他に,parsedateなんてのもあるんだね.parsedateは文字列で与えられた日付表現を解析するだけと,機能が限定的っぽいけど,ただ文字列の日時を解析したいだけならtimeやdateをrequireするより,parsedateをrequireしたほうがインタプリタ的には楽なのかな?

String.concat

なんか本で見た覚えのあるメソッドだけど,書いてて思い出せなかったので書いておこう.

concat(other)
文字列 other の内容を self に連結します(self の内容が変更されます)。 other が 0 から 255 の範囲の Fixnum である場合は その 1 バイトを末尾に追加します。

プログラミング言語 Ruby リファレンスマニュアルより引用
文字列を連結するなら,concat.

hoge.concat("uho")
hoge + "uho"

は,それぞれ同義.

*1:rubycoさんとこのdateとは,また違うヤツ.ややこしい