CGI初心者のための時間表示に関する質問

このQ&Aのポイント
  • 掲示板を作成中のCGI初心者が、投稿するたびにメッセージの投稿時間を表示したいが、どの部分を変更すれば良いか分からない。
  • 投稿メッセージごとに現在の時刻を表示するために、CGIのプログラムのどの箇所を変更するべきか不明。助言を頂きたい。
  • CGI初心者が掲示板の投稿時間をメッセージ毎に表示させたいが、どの部分を変更すればよいか分からない。アドバイスをお願いします。
回答を見る
  • ベストアンサー

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
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

・#1の補足のプログラムをメモ帳に貼る。 ・「localtime(time)」という文字を検索。 ・一箇所しか出てこないはずなので、「localtime(time)」を「localtime($_[0])」に変更。 これで記録した時間が表示されるはずです。 (こちらで確認済み) あと、$date (sub totime のなかの)ですが、 $date = "$month/$mday $hour:$sec"; では、 "月/日 時:秒" となりますので、 $date = "$month/$mday $hour:$min:$sec"; といったようにしましょうね。

e_class
質問者

お礼

moon_nightさん、ありがとうございます。 できました。 本当にいつもお世話になっております。 これからもよろしくお願い致します.

その他の回答 (3)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

解決したら回答を締め切ったほうがいいと思いますよ^^;

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

時間処理ですが、 記録した時間を処理する為に、データは渡していますが、 渡したデータを使わずに現在の時刻を使用しています。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); ここの処理を ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($_[0]); 又は ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($log[0]); とすればいいと思われます。

e_class
質問者

お礼

moon_nightさん、いつもお世話になっております。 moon_nightさんの教えてくれたソースをカスタマイズしならが、プログラムを組んでいます。 変更後、プログラムを実行しましたが、やはり現在時刻に書き換わってしまいます。 どこか間違ってますかね?

  • chupark
  • ベストアンサー率41% (90/218)
回答No.1

 メッセージが投稿されたときにログファイルなどに投稿内容などを記録していると思いますが、メッセージの投稿された時刻を記録していますか?  ご質問の関数を表示部分にしか使っていないのではないでしょうか?    当然ながら、投稿された瞬間に何時何分かを記録しておかなければあとから調べることはできないですよね。    投稿時に質問文にある関数を使って時刻を取得してログファイルに記録すればよいとおもいますが…。  検討はずれの回答でしたらごめんなさい。

e_class
質問者

補足

chuparkさん、早速のアドバイス本当にありがとうございます。以下、全プログラムなんですが、どこにそれを記述すればいいんですか? 宜しくお願いします。 #!/usr/local/bin/perl require './jcode.pl'; $cgi = "ti.cgi"; $text = "text.txt"; $ENV{'TZ'} = "JST-9"; $time = time; # データ処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/\r\n|\r|\n/<br>/g; $value =~ s/\t//g; #フォーム変数へ $FORM{$name} = $value; } if ($FORM{'title'}) { &kakikomi; } elsif($FORM{'log'}) { &view; } &head; print <<HTML; <form action="$cgi" method="POST"> タイトル:<input type="text" name="title" size="30"><br> 本文<textarea name="com" cols="40" rows="5"></textarea><br> <input type="submit"> </form> HTML open(IN,$text); @text = <IN>; close(IN); foreach $ver (@text) { (@log) = split(/\t/,$ver); &totime($log[0]); print "<a href=\"$cgi?log=$log[0]\">$log[1]</a> <font size=\"-1\">$dete</font><br>"; } &foot; # 書込み sub kakikomi { open(IN,$text); @text = <IN>; close(IN); unshift(@text,"$time\t$FORM{'title'}\t$FORM{'com'}\n"); open(OUT,">$text"); print OUT @text; close(OUT); &head; print <<HTML; <p>書き込みました。</p> <a href="$cgi">もどる</a> HTML &foot; } # 表示 sub view { &head; open(IN,$text); @text = <IN>; close(IN); foreach $ver (@text) { (@log) = split(/\t/,$ver); if ($FORM{'log'} == $log[0]) { &totime($log[0]); print "$log[1] <font size=\"-1\">$dete</font><br>"; print "$log[2]<br>"; } } print "<a href=\"$cgi\">もどる</a>\n"; &foot; } sub head { print "Content-type: text/html\n\n"; print <<HTML; <html> <head> <title>掲示板</title> </head> <body> HTML } sub foot { print <<EOF; </body> </html> EOF exit; } # 時間処理 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); $dete = "$month/$mday $hour:$sec"; }

関連するQ&A

  • 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
  • 掲示板への書き込み時間

    掲示板CGIについて質問です。 使おうとしているスクリプトはそのままアップロードすると書き込みした時間の表示が 「4/14 (Sun) 17:10」 のようになります。 これを 「2003 4/14 (日) 17:10:50」 のように年と秒まで加えたいのです。 それで後者のように表示される掲示板CGIを参考にしてみましたが、目立った違いはないように思え、どこをどう変更すれば年や秒まで表示されるようになるかわかりません。 思い当たる部分はこのあたりなのですが…。 ↓このように記述されています ************ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); $sec = sprintf("%02d",$sec); $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date_now = "$month/$mday ($youbi) $hour:$min"; ************ CGIに手を加えてレイアウトの変更くらいはいつもやっています。 もし書き換える方法がありましたら教えていただければと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • 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
  • perl qw(aaa bbb ccc)[$hoge]のような記述

    my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]); 2行目のsprintfですが、qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]はどのようなことが行われているのでしょうか? sprintf("%s", "hello world!");みたいな基本的なものならsprintfの使い方はわかります。ですが、qw(aaa bbb ccc)[$hoge]のような記述についてがわかりません。 上記の例でいえば、どういう結果になるのかはわかるのですが、どういう過程で代入されているのかがわかりません。 qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]という書式はどういうことが行われているのか教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 変更時間を指定したい

    下記スクリプトのhtmの変更間隔を例えば30秒や15分などの時間単位で指定できるようにしたいのですが時間要素を改良することで可能でしょうか? もし可能ならそのソースの記述方法をお教えください。 #!/usr/local/bin/perl @htm = ( "001.htm", "002.htm", "003.htm", "004.htm", "005.htm", "006.htm", "007.htm", "008.htm", "009.htm", "010.htm" ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $n = @htm; $n = $min%$n; print "Location: http://www.hoge.co.jp/hoge/$htm[$n]\n\n"; exit; ご教授のほど、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • Perlの日付取得で月の表示がおかしい

    下記は、メールフォームCGIに書き込まれた日時などの情報をlog.cgiというファイルに書き出すスクリプトです。 2012/01/04 21:05:45 のような感じで、日付が刻まれるのですが、このうち月の部分がどの月に処理を行ってもいつも01になってしまうのですが、当方直し方がわかりません。 下記が実際の記載箇所です。4行目がおかしいのだと思いますが、どなたかお分かりの方、教えていただけないでしょうか。 my $path = "log.cgi"; my $ip = $ENV{'REMOTE_ADDR'}; ($sec, $min, $hour, $mday, $month, $year, $wday, $stime) = localtime(time()); my $time = sprintf("%04d\/%02d\/%02d %02d\:%02d:%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec); my $message = $in{'メッセージ'}; $message =~ s/\r\n/ /g; $message =~ s/\n/ /g; if (open(FOUT, ">> $path")) { print FOUT "$time\t$ip\t" . $in{'お名前'} . "\t" . $in{'E-mail'} . "\t" . $message . "\r\n"; close(FOUT); } よろしくおねがいいたします。

    • ベストアンサー
    • Perl
  • フォームメール、時刻を設定してその時間に送信されるようにしたい。

    こんにちわ。フォームメールで時刻を設定して、その時間に送信できるようにしたいのですが可能でしょうか?以下のように書いたのですが、うまくいきませんでした。どうかご教授ねがいます。よろしくおねがいします。 $gettime = '200511251300'; ###2005年11月25日13時00分に送信したい。 sub menu { print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> <form method="post" action="$script"> <input type="hidden" name="action" value="send"> <input type="submit" value="配信確認"> </form> </table> </body> </html> EOF } sub send{ if($gettime eq $gettime){&sendmail;} else{&mes('設定した時間に送信します')} } sub sendmail{ #メール送信のサブルーチン省略 } sub mes{ 「設定した時間を送信する」を表示するHTML省略 } sub time{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $timedata = sprintf("%04d%02d%02d%02d%02d",$year+1900,$mon +1,$mday,$hour,$min); $years=$year+1900; $mons=$mon+1;

    • ベストアンサー
    • Perl
  • 次のカウンターのCGIプログラムで間違っているところはどこでしょうか?

    参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。 個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。 いろいろ調べたのですが、どこが間違っているのか分からなくなりました。 どうぞお願いいたします。 ======= #!/usr/local/bin/perl $cookie = $ENV{'HTTP_COOKIE'}; @array = split(/; /, $cookie); foreach $tmp (@array){ ($key, $value) = split(/=/, $tmp); if($key eq 'count'){ $count = $value; } } if( $key == ""){ $count = 0; } $count++; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30); @day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat"); @month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec"); $expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec); print "Content-Type: text/html\n"; print "Set-cookie: count=$count; expires=$expireDate \n\n"; Print "<html>\n"; Print "<title>counter4</title>\n"; print "<body>\n"; print "<h1>個人別カウンター</h1>\n<hr />"; print "あなたは$count回目のご訪問です。\n"; print "</body>\n"; print "</html>"; exit;

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

専門家に質問してみよう