日付と時刻の加減算

プログラムをしていて良く日付や時刻の加減算を行う事があります。
期限を設けて表示を変更したり、DBからの取得条件にしたり様々です。

大抵コンピュータの世界では、秒数を使ってこの加減算をします。
例えば1時間であれば、1(時間) * 60(分) * 60(秒) = 3600となります。

これで基本問題ないのですが、PHPにはstrtotimeという便利な関数があります。

<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>

特に上の3行目以降が非常に便利です。

Ruby

じゃあRubyで同じ事をしてみます。

require "date"
d = Date.today
afterDay = d + 1
beforeDay = d - 5
beforeMonth = d << 1
afterMonth = d >> 5

日付に関しては上記の様に、単純な加減算ができるので非常に便利です。
+/-で日付、<</>>で月の加減ができます。
ですが、PHPの様に"next Thursday"といった計算はできなさそう。

t = Time.now
t = t + 10
t = t - 8

Timeオブジェクトでは秒数の加減しかできません。
持っているデータが1時間の場合、最初に挙げたように3600秒を作成するロジックが必要になります。
少し不便。
まぁラッピングしてあげればいいだけの話だと思いますが。

ついでにSQLでもやってみたのでまとめてみます。

MySQL

SELECT DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL 5 DAY);
SELECT DATE_ADD(NOW(), INTERVAL 12 hour);
SELECT * FROM `user` WHERE lastlogin > (DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -10 DAY));

Interval型を使っています。

PostgreSQL

SELECT current_timestamp + '1 days';
SELECT current_timestamp + '-24 hours';
SELECT INTERVAL '4 hours 3 minutes' + NOW()
SELECT * FROM xxxx WHERE NOW() > date + '+24 hours';

PHPに近い表記ができるようです。

知らないだけでRubyでもできるかも知れません。
ツッコミ頂けたら幸いです。