dポイントプレゼントキャンペーン実施中!

現在perlを使ってCGIを作っているものです。
まだ、一ヶ月ちょっとの初心者と言うこともあり、
日付の操作の仕方で非常に苦労しています。

入力フォームには、リストボックスでそれぞれ、
○○○○年 ○○月 ○○日 ○○時 ○○分があり、
フォームが表示されたときには、デフォルトで、本日の日付がセットされるようになっています。

送信ボタンを押す事で入力チェックがかかるのですが、
そのときに、上記の日付のリストボックスの値が、
本日よりも過去になっていたばあいは、エラーを返すと言う処理を作りたいのですが、どうしてもうまくいきません。
本日日付は、localtime関数で取れるのですが、
リストボックスにセットされている値を日付に変換する方法、
また、比較の仕方がさっぱりわかりません。

誰かわかる方がいましたら、ご教授ください。
具体的なソースも書いていただけると大変ありがたいです。

以上よろしくお願いします

A 回答 (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 を加えています。
    • good
    • 0

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;
}
    • good
    • 0

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

 となります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
早速試して見たいと思います。

ついでに質問なのですが、
回答文中の
とすると、リストボックスの日付を比較可能な形式に変換できます。(ただし時は、12時間制の場合は24時間制に変換します

とありますが、
12時間制の場合は24時間制に変換する方法は
どのようにしたらよろしいのでしょうか?

お礼日時:2003/07/15 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!