Rubyで直前の日曜日の日時を求める

rrdgraphで日曜日始まりの1週間グラフを書きたい時に必要なので.

UNIX時間で0,Time.at(0)がGMTで木曜日の0時なので3日とgmt_offset分だけ平行移動すると,日曜日の0時が1週間(7*86400)で割り切れる値になるので端数を除去,ずらした分だけ元に戻すと直前の日曜日の0時の時刻が得られる.

def last_sunday(t)
	slide = 3*86400 - t.gmt_offset
	t = t.to_i - slide
	return Time.at(t-t%(7*86400)) + slide
end

p Time.now
p last_sunday(Time.now)
p last_sunday(Time.now-86400)
% ruby last_sunday.rb
Sun Aug 21 17:13:42 +0900 2011
Sun Aug 21 00:00:00 +0900 2011
Sun Aug 14 00:00:00 +0900 2011