前回のCGIについての質問の続きになります。よろしくお願いいたします。

原因の部分が判明したのですが、どこが悪いのかがわかりません。
かたちは変えずに修正できるのでしょうか。わかる方お願いいたします。

文中の「$time = timelocal(0, $min, $h, $d, $Mon{$m} - 1, $y);」の部分についてエラーがでます。

# メールの Date から time 値を取得する

sub xxx_get_mail_time{

use Time::Local;

my($da)=@_;

if ($da eq "") {return time;} ## パラメータ空の場合は現在を返す



my($w,$d,$m,$y,$t,$nd,$canma,$find,$wd,,$h,$min,$sec,$nh);

%Mon = ("Jan",1,"Feb",2,"Mar",3,"Apr",4,

"May",5,"Jun",6,"Jul",7,"Aug",8,

"Sep",9,"Oct",10,"Nov",11,"Dec",12);

chomp $da;

$canma = ",";

$find = index ($da, $canma);

if ($find >= 0) {

($w,$d,$m,$y,$t) = split(/ /,$da);

$wd = substr($w,0,3);

}

else{

($d,$m,$y,$t) = split(/ /,$da);

}

if(length($d)==1){

$nd = "0".$d;

}

else{

$nd = $d;

}

$d =~s/^[0]//;

($h,$min,$sec) = split(/:/,$t);

$h =~s/^[0]//;

$min =~s/^[0]//;

$sec =~s/^[0]//;

my $time;

$time = timelocal(0, $min, $h, $d, $Mon{$m} - 1, $y);



return $time;

}

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/17 10:45:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント200pt

【変更点】
コメント欄に同じですが、ハッシュのほうの値を最初からゼロにしておけば、
引き算するという手間がなくなり処理が早くなります

%Mon = ("Jan",0,"Feb",1,"Mar",2,"Apr",3,"May",4,"Jun",5,"Jul",6,"Aug",7,"Sep",8,"Oct",9,"Nov",10,"Dec",11);

$time = timelocal(0, $min, $h, $d, $Mon{$m}, $y);

【追加点】
年は1900年基準で計算しますので1900を引く必要があります

$y -= 1900;
id:rouge_2008

windofjulyさん
> 年は1900年基準で計算しますので1900を引く必要があります

必要がない限り、今後は4桁の西暦をそのまま渡すといいようです。
http://www.h3.dion.ne.jp/~sakatsu/Perl/Notes_Perl_timegm_timelocal.htm

※少ししか確認していないので、解釈間違いがあったらすみません・・・

2012/02/11 01:31:31
id:windofjuly

rouge_2008 さん

2038年問題への対応状況の確認(perlのバージョン確認)は必須でした・・・
あと・・・エラーコメントの確認も・・・
コメントありがとうございました

手っ取り早いのは、$daや、$min, $h, $d, $Mon{$m}, $yの内容をプリントアウトして、
timelocalに正しいパラメータを送れているかどうかを確認してもらうことですが・・・
応答無いので、どうしたものか・・・

2012/02/11 01:52:34
  • id:psne
    >%Mon = ("Jan",1,"Feb",2,"Mar",3,"Apr",4,

    >"May",5,"Jun",6,"Jul",7,"Aug",8,

    >"Sep",9,"Oct",10,"Nov",11,"Dec",12);
    こちらの"Jan",1 を 0からスタートさせてみては?
    ※"Dec"は11になります
  • id:rouge_2008
    > 文中の「$time = timelocal(0, $min, $h, $d, $Mon{$m} - 1, $y);」の部分についてエラーがでます。

    メールのDateヘッダ形式の「Mon, 22 Mar 2010 11:17:00 +0900」あるいは「22 Mar 2010 11:15:18 +0900」という日付の文字列を渡してxxx_get_mail_timeを実行しても特にエラーは発生しませんでした。
    どのようなエラーが表示されるのですか?
    出力されるエラーの文字列をコピー&ペーストして教えてください。
    (※エラーが出力されない場合、上記の箇所に問題がある事をどのように確認したのですか?)
    ※それから、Perlのバージョンはいくつでしょうか?

    また、「return $time;」で返された値を、その後どのように処理していますか?
    (返された値を使って続けて別の処理をしていると思いますが、どのような処理を行っているのでしょう?)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません