漢字交じり文字列からのlocaltimeの求め方

このQ&Aのポイント
  • perlのCIGを改造してエラーチェック機能をつける方法を教えてください
  • フォームから送られてくる文字列から数字部分だけ抜き出してlocaltimeに変換する方法を教えてください
  • timelocalの式に代入するとinternal server errorになってしまう問題を解決する方法を教えてください
回答を見る
  • ベストアンサー

漢字交じり文字列からのlocaltimeの求め方

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を求めるにはどうしたらよいのでしょうか?

  • MORGEN
  • お礼率100% (466/466)
  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.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秒)います。

MORGEN
質問者

お礼

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

関連するQ&A

  • localtimeについて

    まだCGIを勉強はじめのなのですが、localtimeについて質問させてください。 書籍で時間取得には ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); とし、time関数で得たものをlocaltime関数で整形 といった事が書かれています。 まずわからないのが最初の ($sec,$min,$hour,$mday,$mon,$year,$wno) = の部分なのですが、カッコ内に変数を並べるというのはどういった命令なのでしょうか?書籍ではここまででこのような使い方や記述は出てきていないので、それ自体がよく理解できずにいます。それとも($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);をおきまりパターンとしてワンセットで覚えるべき事なのでしょうか。 続いてlocaltime(time)ですが、これは()内のtime関数によって取得された1970年基準からの秒数を、localtimeによって英語圏での標準的な日付時間表記に直して表示するという事で良いのですよね? これが、なぜ ($sec,$min,$hour,$mday,$mon,$year,$wno) とすることで各変数に割り振ることができるのかがよく分かりません。 これらはおきまりパターンとして覚えるべき事なのでしょうか?それとも配列のようにあるパターンに乗っ取って書かれ得いる事で他に応用がきくような意味合いのものなのでしょうか? ご教授いただきたく思います。 よろしくお願いします。

    • 締切済み
    • CGI
  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • Perlスクリプト (); wantarry, (localtime)[0..2]; について。

    人様の作ったスクリプトの解析をしています。 下記のスクリプトについて質問があります。 my $now = zikoku(); print "$now です。\n"; sub zikoku { my ($sec, $min, $hour) = (localtime)[0..2]; if (wantarray) { return ($hour, $min, $sec); } else { return sprintf "%02d:%02d:%02d", $hour, $min, $sec; } } まず、zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。();は何なのでしょうか?? また、localtime関数の次の[0..2]の意味が分かりません。 そして、wantarray関数自体の働きは一応理解しているのですが、ここではwantarray関数にどのような意味があるのかが分かりません。 分かる方いらっしゃいましたらご教授頂けると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl 水曜日に処理を変えたい

    人の作ったものですが、月曜午前0時で処理を切り替えるようになっています。 これを水曜午前0時に変更するにはどうすればいいでしょうか? 長いですがよろしくお願いします。 sub GetNextWDayTime { my $time = time; my ($sec, $min, $hour, $wday) = (localtime($time))[0,1,2,6]; my $now = ($wday * 60 * 60 * 24) + ($hour * 60 * 60) + ($min * 60) + $sec; my $next = ($_[0] * 60 * 60 * 24) + ($_[1] * 60 * 60) + ($_[2] * 60) + $_[3]; #if $next is small, $next is next week. if($next < $now){ $time = $time + (60 * 60 * 24 * 7); } $time = $time + (($_[0] - $wday) * 60 * 60 * 24); $time = $time + ($_[3] - $sec); $time = $time + (($_[2] - $min) * 60); $time = $time + (($_[1] - $hour) * 60 * 60); return $time; } sub GetLastWDayTime { my $time = time; my ($sec, $min, $hour, $wday) = (localtime($time))[0,1,2,6]; my $now = ($wday * 60 * 60 * 24) + ($hour * 60 * 60) + ($min * 60) + $sec; my $last = ($_[0] * 60 * 60 * 24) + ($_[1] * 60 * 60) + ($_[2] * 60) + $_[3]; #if $last is large, $last is next week. if($last > $now){ $time = $time - (60 * 60 * 24 * 7); } $time = $time + (($_[0] - $wday) * 60 * 60 * 24); $time = $time + ($_[3] - $sec); $time = $time + (($_[2] - $min) * 60); $time = $time + (($_[1] - $hour) * 60 * 60); return $time; }

    • ベストアンサー
    • Perl
  • 2つの日付・時間の差分を求めるには

    2つの日付、時間の差分を求めるには、 timelocal を使うのかと思うのですが、 $time1 = timelocal($sec1,$min1,$hours1,$day1,$month1,$year1); $time2 = timelocal($sec2,$min2,$hours2,$day2,$month2,$year2); $result = int(($time2 - $time1)/(60*60*24)); return $result; ではいけないのでしょうか?

    • ベストアンサー
    • Perl
  • localtimeについて

    C言語のlocaltimeについて質問です。 ファイルから通算秒の値を読み込み、それを構造体2次元配列に格納し、locatime関数で日付を計算したいんです。 しかし、うまく変換できていないようで想定していない日付になってしまいます。 例えば typedef struct TIME { time_t time; } TIME; struct tm *s; long time1; ←ファイルから読み込んだ通算秒が格納されている TIME t[5][10]; for(i=0; i<5;i++) { for(j=0;j<10;j++) { t[i][j].time = time1; s = localtime(&t[i][j].time); /* (1) */ printf("時 : %d\n",s->tm_hour); printf("分 : %d\n",s->tm_min); } } printfで時間と分を出力すると時間が11時間ほどずれています。 (1)があやしいと思うのですが、間違いがわからないので、どうかご教授ください!

  • localtime()での時間差の計算の仕方

    $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $now =sprintf("%04d/%02d/%02d-%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min); とすると 2007/01/28-15:56 のようにデータとして取得できるのですが・・・ これと登録日($date=2006/12/31-12:25)との日数差の計算ができません $now-$date とすると年数のところしか計算できず1としか表示できません 登録7日後以降にイベントを発生させたいのですが計算ができないのでうまくいきません 両方time()でやれば$now-$date>604800 とすればなんとかできるのですが登録日は『2006/12/31-12:25』の形で使いたいのです 登録日と現在の日数の差の計算方法を教えてくださいm(--)m

    • ベストアンサー
    • CGI
  • 日付求め

    お世話になります。 早速ですが、perlで以下のように 現在時刻を求め表示するロジックがあります。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year=$year + 1900; $mon =$mon + 1; $date81 = "$year年$mon月$mday日($days[$wday])"; $date82 = "$hour時$min分$sec秒"; この時、 例えば今年末であれば、 2009年1月1日0時と表示されると思います。 これを2008年12月31日24時と表示したいのですが、 何か妙案はあるでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • CGIについて(時間表示)

    CGI初心者ですが、掲示板を作成中です。投稿するたびにメッセージの投稿時間がすべて現在時刻に書き換わります。 メッセージ毎に時間表示させたいのですが、いかのプログラムのどこを変更すればよいのでしょうか?宜しくお願いいたします。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year +=1900; $month++; $year = sprintf("%04d", $year); $month = sprintf("%02d", $month); $mday = sprintf("%02d", $mday); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); $date = "$month/$mday $hour:$sec"; }

    • ベストアンサー
    • CGI
  • Javascriptによる時間に応じたアクセス制限を確実にする方法

    CGIの中に、 ($sec, $min, $hour, $day, $mon, $year) = localtime(time); として return"恐れ入りますが、現在は受付時間外です" if $hour < 10 && $hour > 22; で深夜から朝にかけてのフォーム受付を拒否する仕組みになっているPerlのCGIがあるのですが、これだと、フォームを送信しにアクセスする側のパソコンの時計が狂っていたり意図的にPCのカレンダーをいじって時間帯制限をかいくぐられるとエラーにならずにフォームが送信されてしまいます。 このような抜け穴をなくし、実際の日本時間が22時以降20時以前の場合はPCの時計が何時になっていようと「申し訳ありませんが…のメッセージを表示できるようにするにはどうしたら良いでしょうか? おわかりの方がいらっしゃいましたらどうか具体的なソースをご教授いただきたく、どうかよろしくお願い致します。

専門家に質問してみよう