プロが教える店舗&オフィスのセキュリティ対策術

perlのCIGを改造してエラーチェック機能をつけようとしています。
htmlのフォームから「2004年5月16日登録」とか「2005年12月22日削除」といった文字列が送られてくるのですが、ここから数字部分だけ抜き出してlocaltimeに直し、改造前からcgiに備わっている($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);で割り出した数値と比較して例えばif $hikaku>localtime...errorといった形でエラーを返すようにしようとしています。
ここで、フォームから送られたデータから「2004」を抽出するには
@kirokunen = split(/年/,$hiduke);
$nenn = $kirokunen[0]);
「5月」の5を抽出するには2004を抽出した残りを利用して
@kirokugatu = split(/月/,$kirokunen[1]);
$gatu = $kirokugatu[0]);
同様に
@kirokuniti = split(/日/,$kirokugatu[1]);
$gatu = $kirokuniti[0]);
として
$hikaku = timelocal($sec, $min, $hour, $niti, $gatu - 1, $nenn);
としてtimeを求めようとしたのですが、年号だけは抽出できたのに、月や日は、表面上は「5」とか「16」と言った具合にちゃんと数字だけになっているのに、timelocalの式に代入するとinternal server errorになってしまいます。
これは何がいけないのでしょうか?
他の部分の改造は手に負えないので、フォームから送らせるデータの方は直さず、「2004年5月16日登録」の形からtimelocalを求めるにはどうしたらよいのでしょうか?

A 回答 (1件)

Unix Time を求めたいわけですね。


ということはlocaltimeは使えません。
Time:Localモジュールを使用することで簡単に求められます。

なお、localtimeで日時を求めたときは月を+1、年を+1900する必要がありますが、逆にUnix Timeを求めたい時はその逆をしてから代入しなければなりません。

$time = '2004年5月16日登録';

use Time::Local;
$time =~ /^(\d{4})年(\d{1,2})月(\d{1,2})日.*$/;

$unixtime = &timelocal(0,0,0,$3,$2-1,$1-1900);

これで変数unixtimeにUnix Timeが入ります。
なお、ここでは時と分と秒はどれも0として(0時0分0秒)います。
    • good
    • 0
この回答へのお礼

早々のお返事をどうもありがとうございました!
おかげさまでうまく行きました!!
「え?うそ!」と言ってしまったくらいです。もっと大変な事になるんだと思っていました。
$time = ̄ /^(\d{4})年(\d{1,2})月(\d{1,2})日.*$/;
という分割の仕方も初めて知り、大変参考になりました。
この度はどうもありがとうございました!!

お礼日時:2004/05/28 00:50

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