CGI-BBS > CGI > Perl > 日付の計算


カレッヂ
カレッヂ


質問者 たぬぽん  投稿日 7/25(水) 14:36:21
☆投稿ネタ☆
日付の計算でちょっと困っています。教えて下さい。

入力された日付をXX月後の日付に変えたいのです。
日付の計算なんですが、XX月後の日付を求めたいのです。
現在下のような記述でやっていますが、もっと簡単な方法や関数があれば教えていただきたいと思います。

また、同じようにXX日後の日付も出せるようにしたいです。(30日とか31日があってややこしいのですが...。)
どうか助言をお願いします。
------------------------------------------------------------------------------
入力した値
$START = '2001/08/01';
$KIKAN = '48';

@DATE_T = split(/\//,$START);

#形式フォーマット
$DATE_T[1] = $DATE_T[1] + $KIKAN;
$DATE_T[0] = $DATE_T[0] + ($DATE_T[1] / 12);
$DATE_T[1] = $DATE_T[1] % 12;
$DATE_TIME = sprintf("%04d/%02d/%02d", $DATE_T[0], $DATE_T[1], $DATE_T[2]);
------------------------------------------------------------------------------
回答者 しあわせのツボ  [削除]  投稿日 7/25(水) 15:34:42
例のままだと、1月31日の1ヶ月後が2月31日になってしまいますね。
私なら以下のように書き直します。
$START = '2001/08/01';
$KIKAN = '48';
@DATE_T = split(/\//,$START);
$DATE_T[1] = $DATE_T[1] + $KIKAN;
while ($DATE_T[1] > 12) { ++$DATE_T[0]; $DATE_T[1] -= 12; }
if ($DATE_T[0] % 4) { $febdays = 28; } else { $febdays = 29; } # これで対応できるのは1901年〜2099年です
@mdays = ('',31,$febdays,31,30,31,30,31,31,30,31,30,31);
if ($DATE_T[2] > $mdays[$DATE_T[1]]) { $DATE_T[2] = $mdays[$DATE_T[1]]);
$DATE_TIME = join('/', @DATE_T);

日数計算はちょっと書ききれません。
レスキューさんのwebdiaryが同様の処理を行っているので参考になるはずです。
質問者 たぬぽん  [削除]  投稿日 7/26(木) 11:35:06
ありがとうございました。
おかけで参考&勉強になりました。

日付の計算ってちょっとややこしいですね...。(^^ゞ

また、困ったことがあったらよろしくお願いします。

このページは終了したので返信(回答)は書きこめません

Web裏技