>>324
TimeとTimeSpanの2つでいいんだよ
Timeを大きくしたくなかったから分かれてしまったけど、実用上は失敗だと思う
拡張TimeとDateとDateTimeとParseDateは require 'time' 一発で読まれて、Timeクラスの拡張として振る舞うべき

def timespan(end_time, start_time)
require 'time'
t2 = end_time.kind_of?(Time) ? end_time : Time.parse(end_time)
t1 = start_time.kind_of?(Time) ? start_time : Time.parse(start_time)
Hash[*%w(sec min hour day month year).zip(t2.to_a[0..5].zip(t1.to_a[0..5]).map{|a| a[0] - a[1]}).flatten]
end

def timespan_to_s(end_time, start_time, format='hour:min:sec')
str = format.dup
timespan(end_time, start_time).each{|name, value| str.sub!(/#{name}/){value}}
str
end

t2, t1 = '2011-06-22 08:23:45', '2011-06-22 07:00:00'
p timespan(t2, t1) #=> {"month"=>0, "hour"=>1, "day"=>0, "sec"=>45, "year"=>0, "min"=>23}
p timespan_to_s(t2, t1) #=> "1:23:45"
puts timespan_to_s(t2, t1, 'hour時間min分sec秒') #=> 1時間23分45秒