日付のパース

Rubyの組み込みライブラリのTimeは日付のフォーマットはできるけどパースはできない。実は結構見落とすことが多いんだけど、添付ライブラリのほうにtimeというのがあって、パースはそっちでできる。

require 'time'
t = Time.parse('1999/07/01 06:06:06')

require 'time'が必要なことに注意。同じTimeクラスだけどparseメソッドは組み込みの方にはないので。って思ってたけどrequireしなくても動いてしまった。何で?

他にもメールなどで使うTime#rfc822()やHTTPで使うTime#httpdate()、XMLSchemaで使うTime#xmlschema()もある。これらは同じ名前でクラスメソッドとインスタンスメソッドがあって、クラスメソッドの方はパースしてTimeオブジェクトを返し、インスタンスメソッドの方はその形式の文字列を返す。そう聞くと分かりにくいけど、使っているところを見ればすんなり理解できると思う。

require 'time' # 念のため

# クラスメソッドは文字列からTimeを作る。
t = Time.rfc822("Mon, 11 Feb 2008 22:44:13 +0900")
t = Time.httpdate("Mon, 11 Feb 2008 13:44:13 GMT")
t = Time.xmlschema("2008-02-11T22:44:13+09:00")

# インスタンスメソッドはTimeから文字列を作る。
puts t.rfc822
puts t.httpdate
puts t.xmlschema

ちなみにスパムとかでたまにある0月とか0日とかをパースしようとするとArgumentErrorになるので注意。

他にも組み込みクラスを拡張するライブラリが幾つかあるので、せめて添付ライブラリのマニュアルぐらいは一通り目を通しておくことをお勧めします。
Threadをよく使う人にはthreadなんて便利かも。