現在perlを使ってCGIを作っているものです。
まだ、一ヶ月ちょっとの初心者と言うこともあり、
日付の操作の仕方で非常に苦労しています。
入力フォームには、リストボックスでそれぞれ、
○○○○年 ○○月 ○○日 ○○時 ○○分があり、
フォームが表示されたときには、デフォルトで、本日の日付がセットされるようになっています。
送信ボタンを押す事で入力チェックがかかるのですが、
そのときに、上記の日付のリストボックスの値が、
本日よりも過去になっていたばあいは、エラーを返すと言う処理を作りたいのですが、どうしてもうまくいきません。
本日日付は、localtime関数で取れるのですが、
リストボックスにセットされている値を日付に変換する方法、
また、比較の仕方がさっぱりわかりません。
誰かわかる方がいましたら、ご教授ください。
具体的なソースも書いていただけると大変ありがたいです。
以上よろしくお願いします
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 を加えています。
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;
}
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;
}
となります。
ありがとうございます。
早速試して見たいと思います。
ついでに質問なのですが、
回答文中の
とすると、リストボックスの日付を比較可能な形式に変換できます。(ただし時は、12時間制の場合は24時間制に変換します
とありますが、
12時間制の場合は24時間制に変換する方法は
どのようにしたらよろしいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) 過去日付、年の切り替え 6 2022/05/26 12:41
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Microsoft ASP グーグルフォーム 1 2022/12/30 18:16
- Excel(エクセル) Excelで作成しているシート(表) 5 2023/06/15 10:20
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日齢計算プログラム
-
2つの日付・時間の差分を求め...
-
当日の日付をプルダウンメニュ...
-
大至急お願いします。出力で悩み。
-
C言語を用いて、2つのファイル...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
文字の横にプルダウンを表示さ...
-
VBAでPDFのコピーとリネームを...
-
VBA他のブックから値のみ貼付す...
-
セレクトメニューで2つの項目...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
-
構造体の各データの表示につい...
-
プルダウンメニューで中央表示
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
VB6で、長い時間かかる処理...
-
pythonで演算子を変数に代入す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付の差分の求め方(日、分)
-
1桁の日付に0を付ける
-
Perlでsprintf("%02d",$month)...
-
2つの日付・時間の差分を求め...
-
日齢計算プログラム
-
a shower.
-
Perlの日付の比較に関して
-
前日の日付取得するには?
-
サマータイムの判定について
-
pythonのプログラミングについ...
-
時間の計算について
-
VBAでオーバーフローが出て困っ...
-
当日の日付をプルダウンメニュ...
-
「型が一致しません」のエラー...
-
perlでcheckboxがうまく整理で...
-
Schemeのプログラミング うる...
-
perl ハノイの塔の解に順番付け...
-
Perlでテキストファイルの読み込み
-
このソースがコンパイルエラー...
-
PerlからMysqlに接続してデータ...
おすすめ情報