• ベストアンサー

Perl 時間同士の差

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

まず、次の点を意識してください。 ○ Perlにとっては、それは「ただの文字列」であって、「時刻」などではない ○ 文字列を数値演算しようとすると、「先頭の数値と見做せる箇所」が表す数値に変換される $ip[1]='2013-02-12 17:03:45' $time='2013-02-12 20:27:26' の場合 $time=$time-$ip[1]; これは ・ - による数値演算 → 両辺は数値と見做す ・ '2013-02-12 20:27:26' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換 ・ '2013-02-12 17:03:45' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換 →$time= 2013 - 2013 = 0 となり、その「0」と出力されるのが「Perlとして正しい動作」です。 日付の計算をしたいのなら ○DateTimeモジュール等を利用する ○$ip[1]を分解して、timelocal等で epoch秒を計算、 localtimeと比較する ○$ip[1]を分解して、$sec,$min,$hour,$mday,$mon,$yearとそれぞれ比較、集計して差を求める 等の手段を使う必要があります。

spider32
質問者

お礼

お返事遅くなりました。$ip[1]を分解し、timelocalとlocaltimeの差で計算できました。ありがとうございます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

$ip[0] の値もわからんし「正しい時間」とやらがどのようなものなのかもわからん.

spider32
質問者

お礼

ありがとうございます。大変参考になりました。

spider32
質問者

補足

申し訳ありません。記述ミスがありました。 $ip[0]ではなく、$ip[1]でした。 ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); $time = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec); open(OUT, "< test2.csv"); while($data = <OUT>){ chomp($data); @ip = split(/,/,$data); print qq!$ip[1]<br>$time<br>!; $time=$time-$ip[1]; print qq!$time<br>!; ### 出力結果 ### 2013-02-12 17:03:45 2013-02-12 20:27:26 0 ###### $ip[1]には、最終アクセスした時間が入っています。 2013-02-12 17:03:45 $time には現在の時刻です。 2013-02-12 20:27:26 よろしくお願いします。

回答No.1

どんなソースでどんな結果(エラー)になって実際は何がしたいのか、を書かないと何とも言えないですよ。

spider32
質問者

補足

恐れ入ります。説明が不足していました。 ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); $time = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec); open(OUT, "< test2.csv"); while($data = <OUT>){ chomp($data); @ip = split(/,/,$data); print qq!$ip[1]<br>$time<br>!; $time=$time-$ip[0]; print qq!$time<br>!; ### 出力結果 ### 2013-02-12 17:03:45 2013-02-12 20:27:26 2013 ###### となります。2段目と1段目の差が 2013という結果です。 よろしくお願いします。

関連するQ&A