今日は満月?
久しぶりに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とは,また違うヤツ.ややこしい