かっこいい時刻計算
ActiveSupportを使えばわかりやすく時刻計算ができる。時刻の基本単位が秒であることから、Integerに時刻の単位をあらわすメソッドを加えている。min, hour, day, month, yearといったものだ。
だからたとえば1984/12/26から現在まで何年たっているかは次のように書ける。時刻の差を「1.year」で割るのがポイント。Rubyの文法を巧みに利用することで、直観的でかっこいい表現だと思う。
require 'rubygems' require 'active_support' today = Time.now birth = Time.local 1984,12,26 (today-birth) / 1.year # => 23.0202540144726
でも、年には閏年があるし、1月は30日だったり31日だったりするけどどうなのか検証してみる。
require 'rubygems' require 'active_support' 1.day == 60 * 60 * 24 # => true 1.year.to_f / 1.day # => 365.25 1.month # => 2592000 1.month.to_f / 1.day # => 30.0 (1.year - 12.month) / 1.day # => 5
一日は60*60*24秒固定なので問題ない。
一年は閏年があるので一日で割ってみると、365.25日と出た。例外もあるがほぼ4年に1回閏年があるのでおおかた間違っていない。
では一月はどうなのか…30日として計算している(^^; だから12ヶ月と1年は5日ずれがあることがわかった><意外にハマりそうだ。
時刻・日付計算ライブラリを作るのは簡単そうで意外に難しい。
それでも秒〜日まではきちんと計算してくれる。
DateTime::Smartなんてのもある。