かっこいい時刻計算

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なんてのもある。