アプリ版:「スタンプのみでお礼する」機能のリリースについて

恐れ入ります。
Perlを使って、時間と時間の差を求めたいのですが、
なかなかうまくいきません。

一度、txtファイルに書き込み日時を保存したあと、
それをperlにて読み込み、現在時刻との差を出して投稿制限を掛けたいのですが、
どのようにしたらよろしいでしょうか。

現在書き込み日時はtxtファイルに保存し、cgiファイル上に、出力済みで、localtimeも出力済みです。
単純に引いて関数に代入しても、正しい時間を得られません。

よろしくお願いします。

A 回答 (3件)

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

この回答への補足

恐れ入ります。説明が不足していました。

($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という結果です。

よろしくお願いします。

補足日時:2013/02/12 20:32
    • good
    • 0

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

この回答への補足

申し訳ありません。記述ミスがありました。
$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

よろしくお願いします。

補足日時:2013/02/12 23:14
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/27 13:56

まず、次の点を意識してください。


○ 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とそれぞれ比較、集計して差を求める
等の手段を使う必要があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/21 11:13

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