- ベストアンサー
Perlの日付の比較に関して
現在perlを使ってCGIを作っているものです。 まだ、一ヶ月ちょっとの初心者と言うこともあり、 日付の操作の仕方で非常に苦労しています。 入力フォームには、リストボックスでそれぞれ、 ○○○○年 ○○月 ○○日 ○○時 ○○分があり、 フォームが表示されたときには、デフォルトで、本日の日付がセットされるようになっています。 送信ボタンを押す事で入力チェックがかかるのですが、 そのときに、上記の日付のリストボックスの値が、 本日よりも過去になっていたばあいは、エラーを返すと言う処理を作りたいのですが、どうしてもうまくいきません。 本日日付は、localtime関数で取れるのですが、 リストボックスにセットされている値を日付に変換する方法、 また、比較の仕方がさっぱりわかりません。 誰かわかる方がいましたら、ご教授ください。 具体的なソースも書いていただけると大変ありがたいです。 以上よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Time::Local を使ってもできます。 前提は No.1、No.2 と同じで。 use Time::Local; my $in_time = get_input_time(); if ($in_time < time) { # 指定日時が過去だった場合の処理 } sub get_input_time { $in{year} -= 1900; $in{month}--; $in{hour} += 12 if $in{tm} eq "PM"; ※ return timelocal(0, @in{ qw/minute hour day month year/ }); } Time::Local は localtime() の逆を行う timelocal() を提供する標準モジュールです。 この timelocal() の戻値を、現時刻を返す time() と比較することで過去かどうかのチェックができます。 ※「12時間制」は hour の範囲が 0~11 であると仮定し、PM の場合のみ 12 を加えています。
その他の回答 (2)
- Ethersky
- ベストアンサー率71% (168/235)
xprintf ではなく sprintf です。 ・12時間制を24時間制に直してから比較 $in{tm}にAM or PM(午前か午後)が入っているとする。 if($in{tm} eq 'PM'){ $in{hour} += 12; }elsif ($in{tm} eq 'AM' && $in{hour} == 12){ $in{hour} = 0; } #午後だった場合は+12しています。 #(例:午後3時だったら+12して15時にする) #午前かつ12時なら0時に直してます。 $cmp_form = sprintf("%04d%02d%02d%02%02d%02d",$in{year},$in{month},$in{day},$in{hour},$in{minute}); ($sec,$min,$hour,$mday,$month,$year,$wday,$yday, $isdst) = localtime(time); $cmp_now = sprintf("%04d%02d%02d%02%02d%02d",$year+1900,$month+1,$mday,$hour,$min); if($cmp_form < $cmp_now){ # 設定日付が過去のものであった場合の処理 print "日付が設定エラーです!!"; exit; }
たとえば、リストボックスの値が $in{year} に年、$in{month} に月、$in{day} に日、$in{hour} に時、$in{minute} に分が入っているものとします。 このとき、 $cmp_form = xprintf("%04d%02d%02d%02%02d%02d", $in{year}, $in{month}, $in{day}, $in{hour}, $in{minute} ); とすると、リストボックスの日付を比較可能な形式に変換できます。(ただし時は、12時間制の場合は24時間制に変換します) 現在時刻も、 ($sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst) = localtime(time); $year+=1900; $month++; $cmp_now = xprintf("%04d%02d%02d%02%02d%02d", $year, $month, $mday, $hour, $min ); という具合に変換してやれば比較可能になりますから、 if ( $cmp_form < $cmp_now ) { # 設定日付が過去のものであった場合の処理 print "日付が設定エラーです!!"; exit; } となります。
お礼
ありがとうございます。 早速試して見たいと思います。 ついでに質問なのですが、 回答文中の とすると、リストボックスの日付を比較可能な形式に変換できます。(ただし時は、12時間制の場合は24時間制に変換します とありますが、 12時間制の場合は24時間制に変換する方法は どのようにしたらよろしいのでしょうか?