• ベストアンサー

Perlの日付の比較に関して

現在perlを使ってCGIを作っているものです。 まだ、一ヶ月ちょっとの初心者と言うこともあり、 日付の操作の仕方で非常に苦労しています。 入力フォームには、リストボックスでそれぞれ、 ○○○○年 ○○月 ○○日 ○○時 ○○分があり、 フォームが表示されたときには、デフォルトで、本日の日付がセットされるようになっています。 送信ボタンを押す事で入力チェックがかかるのですが、 そのときに、上記の日付のリストボックスの値が、 本日よりも過去になっていたばあいは、エラーを返すと言う処理を作りたいのですが、どうしてもうまくいきません。 本日日付は、localtime関数で取れるのですが、 リストボックスにセットされている値を日付に変換する方法、 また、比較の仕方がさっぱりわかりません。 誰かわかる方がいましたら、ご教授ください。 具体的なソースも書いていただけると大変ありがたいです。 以上よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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)
回答No.2

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; }

noname#25358
noname#25358
回答No.1

 たとえば、リストボックスの値が $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; }  となります。

aquapark4
質問者

お礼

ありがとうございます。 早速試して見たいと思います。 ついでに質問なのですが、 回答文中の とすると、リストボックスの日付を比較可能な形式に変換できます。(ただし時は、12時間制の場合は24時間制に変換します とありますが、 12時間制の場合は24時間制に変換する方法は どのようにしたらよろしいのでしょうか?

関連するQ&A