• ベストアンサー

Perlの日付の比較に関して

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

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • perl/cgiについて、教えて下さい。

    perl/cgiについて、教えて下さい。 下記のようなことを、行いたいと考えています。 とりあえず、  a.html  b.html  c.html があり、 __________________________________ 1:それぞれ、フォームに、テキストボックスが一つあります。 2:他のフォームに遷移できます。(例:a.htmlからc.hmtlのように) 3:各フォームに「A、B、Cの値を確認」ボタンがあります。 4:3のボタンをクリックすると、各テキストボックスで入力した 値が表示される。 【イメージ】 a.htmlのテキストボックスに、100を入力 b.htmlのテキストボックスに、200を入力 c.htmlのテキストボックスに、300を入力 した場合。 Aで入力された値は100です。 Bで入力された値は200です。 Cで入力された値は300です。 ______________________________________ と表示させる、cgiを作成したいです。 又、その際、hiddenを使用して行う方法(手順)を教えて頂けないでしょうか。 ファイルに書き込むことで、値を保持しておくのではと 考えましたが、a.htmlの値100を書き込み、再度、a.htmlの 値を書き込むと、a.htmlのフォームから送られた値が2つ(1回目、2回目)書き込まれた 状態になるように思います。 今回のように、例えば、ファームの入力値を保持して他の(b.thmlなど)に 遷移し、ボタンをクリックすると、全フォームの値を表示するような場合、 どのような方法が考えられるのでしょうか? どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • CGI,Perlで下記のようなことを、行いたいと考えています。

    CGI,Perlで下記のようなことを、行いたいと考えています。  a.html  b.html  c.html があり、 __________________________________ 1:それぞれ、フォームに、テキストボックスが一つあります。 2:他のフォームに遷移できます。(例:a.htmlからc.hmtlのように) 3:各フォームに「A、B、Cの値を確認」ボタンがあります。 4:3のボタンをクリックすると、各テキストボックスで入力した 値が表示される。 【イメージ】 a.htmlのテキストボックスに、100を入力 b.htmlのテキストボックスに、200を入力 c.htmlのテキストボックスに、300を入力 した場合。 Aで入力された値は100です。 Bで入力された値は200です。 Cで入力された値は300です。 ______________________________________ と表示させる、cgiを作成したいです。 又、その際、hiddenを使用して行う方法(手順)を教えて頂けないでしょうか。 ファイルに書き込むことで、値を保持しておくのではと 考えましたが、a.htmlの値100を書き込み、再度、a.htmlの 値を書き込むと、a.htmlのフォームから送られた値が2つ(1回目、2回目)書き込まれた 状態になるように思います。 今回のように、例えば、ファームの入力値を保持して他の(b.thmlなど)に 遷移し、ボタンをクリックすると、全フォームの値を表示するような場合、 どのような方法が考えられるのでしょうか? どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • perl/cgiについて、教えて下さい。

    perl/cgiについて、教えて下さい。 行いたい事ですが、 1:a.html(テキストボックスとsubmitボタンがあるだけです) 2:b.html(テキストボックスとsubmitボタンがあるだけです) 3:c.html(1,2のテキストボックスの内容を表示するだけです。) 4:x.cgi があります。4のcgiにはまだ何も記述していませんが、1,2のテキストボックスで入力した値を c.htmlに表示させたいと考えています。 又、c.htmlで値を変更すると、1,2のテキストボックスの値も連動して変わるようにしたいです。 例)a.htmlのテキストボックスで「13」と入力してsubmitボタン押下。c.htmlに「13」が表示される。 c.htmlで「13」を「22」に変更すると、a.htmlのテキストボックスの値も「22」になるといったイメージです。 どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • VBA publicで日付が呼び出せない

    VBAにて、ユーザーフォーム上のテキストボックスに初期値として今日の日付が入力されており、さらにそれを任意で変更することも出来、最終的なテキストボックスの値を変数に格納するというマクロを作成しようとしています。 'テキストボックス2の初期値を今日の日付とする Private Sub UserForm_Initialize() TextBox2.Text = Format$(Date, "yyyy/mm/dd") 'テキストボックス2の値が日付かどうかチェック Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If IsDate(TextBox2.Value) Then DenpyouDate = TextBox2.Value Else TextBox2.Value = "" MsgBox ("日付が不正です") TextBox2.Text = Format$(Date, "yyyy/mm/dd") End If End Sub '他のモジュールでdenpyoudateを使用し、指定のセルに和暦形式で入力する Public DenpyouDate As Date Sheets("伝票").Range("A10").Value = Format(DenpyouDate, "e") Sheets("伝票").Range("C10").Value = Format(DenpyouDate, "m") 「ユーザーフォームのテキストボックスに初期値として日付を表示させ、その最終的な値を変数として格納、別のモジュールで呼び出してセルにセットする」というイメージです。 このマクロを実行した際、初期値である今日の日付を任意の日付に変更した場合は、問題なくそのままの値がセルにセットされるのですが、初期値のまま実行すると、その数値が反映されません。 ローカルウィンドウをチェックすると、ユーザーフォームの時点では、テキストボックスの初期値がきちんとdenpyoudateに格納されているのですが(例:2009/11/24)、それを別モジュールで呼び出した時は、denpyoudateの値が(#0:00:00#)になっており、これが原因だと考えています。 このエラーを回避し、初期値の場合でも値がきちんとセルにセットされるようにするには、どうしたらよいでしょうか?

  • CGI/Perlでメールフォームを作るには。

    CGI/Perlでメールフォームを作るにはHPのトップページ(ソースコード)にCGI/Perlのプログラムを入力すればメールフォームは使用できるようになるのでしょうか? よろしくお願いします。

    • 締切済み
    • CGI
  • Perl 時間同士の差

    恐れ入ります。 Perlを使って、時間と時間の差を求めたいのですが、 なかなかうまくいきません。 一度、txtファイルに書き込み日時を保存したあと、 それをperlにて読み込み、現在時刻との差を出して投稿制限を掛けたいのですが、 どのようにしたらよろしいでしょうか。 現在書き込み日時はtxtファイルに保存し、cgiファイル上に、出力済みで、localtimeも出力済みです。 単純に引いて関数に代入しても、正しい時間を得られません。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlの関数の引数について詳細

    perlで引数に関することでわからないことがあるのですが、以下の状態で、実行した際に、$aは1が入るのはわかりますが、$bには具体的にどんな値が入っているのでしょうか? 引数が無い場合は、デフォルトで1をセットしたいです。 phpのvar_dump関数のようなものがPerlには存在すれば便利ですが、そういうものはあるのでしょうか? sub test{ my ($a, $b, $c, $d) = @_; } &test(1); あと引数の数を2つは必須にして、残りの引数(3つ目はデフォルトで1つ目の引数と同じ値になり、4つ目以降はデフォルトで1となる 関数のプロトタイプを書きたいのですが、どうですればよいのでしょうか? sub test($$;@  ?のようなものを見たことがあるのですが、どんな意味をしているのでしょうか?結構複雑な引数を持たせることができそうなのですが、詳しく書かれている本などご存知の方教えてください。

    • ベストアンサー
    • Perl
  • アクセスのコンボボックスの作成方法(日付)について

    アクセスのフォーム上で日付を入力するコンボボックスを作成したいのですが、作成方法がわかりません。どなたか詳しい方、教えてください。具体的には、コンボボックスのリストに 今日の日付・昨日の日付・一昨日の日付 がでるようにしたいのです。  例)2007/06/12 2007/06/11 2006/06/10 宜しくお願いします。

  • perlについて、教えてください。

    perlについて、教えてください。 formからのデータを受け取り、ファイルに書き込んでいく、cgiプログラムを考えているのですが、 その際、ファイルに特定の文字列があった場合、その行を削除して、書き込むという事を行いたいです。 例)test.htmlのテキストボックスに、値を入力(name="a_text")。そして、x.cgiファイルで, 「name=a_text」を取得し、keep.cgiファイルに書き込む。 再度、test.htmlの入力値を受け取り、ファイルに書き込む際に、ファイルに「a_text」があれば、その行を削除してから、a_textの2回目の入力値を書き込みたいと考えています ご存知の方、ぜひ、ご教授下さい。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 指定日付から90日後の日付を算出するには

    Perlの質問です。 登録日 2006/1/1 2006/2/10 2006/2/20 2006/3/15 の様なテキストファイルがあります。 このファイルを読み込んで、各レコードの値ごとに この登録日より90日後の日付を算出したいのですが、どのようなコードになるのでしょう。 ちなみに現在から何日後の日付を出すというサンプルは見つけました。 http://www.aimix.jp/cgi/accdatecnt.html しかしこれはtimeで現在日時を取り出して、それに何日間を秒単位にして加算するということなので、理屈はわかるのですが、いまいち今回のやりたいことに結び付けれません。 timeが1970年1月1日 00:00:00 から現在までの秒数を算出する関数ですから このように、先のリストの例でいうと、2006/1/1 00:00:00は、1970年1月1日 00:00:00 から何秒目なのかを算出できればなんとか出来そうなんですが・・・

    • ベストアンサー
    • CGI