CGIでLast-Modified出力しようと思ったときに、
「Sat, 02 Sep 2006 14:41:27 GMT」
こんな感じの書式で日時を出力しなきゃいけないんですよね。
ちと生成めんどう。
ってわけで、
HTTP::Date
Date::Simple
とかモジュール使うこと考えたんだけど、
どっちも標準モジュールじゃないみたいですね。
てか、Date::Simpleじゃ対応してない形式かも。
で、
日付の出力のためだけに標準じゃないモジュール使うのは避けたいなー
思って、自力でやっちゃった。
@time=gmtime(time);
for(0..3){
$time[$_]='0'.$time[$_] if(length($time[$_])==1);
}
$time[4]=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")[$time[4]];
$time[5]+=1900;
$time[6]=("Sun","Mon","Tue","Wed","Thu","Fri","Sat")[$time[6]];
$time="$time[6], $time[3] $time[4] $time[5] $time[2]:$time[1]:$time[0] GMT";
そんなむずくないね。
まず、
localtimeに比べて滅多に使わないgmtimeだけど、一応標準関数。
localtimeと同じ感じでGMT返してくれる。
0=秒
1=分
2=時
3=日
ですから、まずこれらが1桁なら頭に0追加。
月は英字3文字表記にしなきゃいけないんで、
リスト作って対応位置のものに変換。
年は+1900する。
曜日は月と同じ感じで。
てな感じ。
逆に、こんな形式の日時からエポック秒に戻すには、
use Time::Local;
($time[6],$time[3],$time[4],$time[5],$time[2],$time[1],$time[0])=$DATE=~/(\w+), (\d+) (\w+) (\d+) (\d+):(\d+):(\d+)/;
%w=("Sun"=>0,"Mon"=>1,"Tue"=>2,"Wed"=>3,"Thu"=>4,"Fri"=>5,"Sat"=>6);
$time[6]=$w{$time[6]};
%m=("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[4]=$m{$time[4]};
$time[5]-=1900;
$time=Time::Local::timegm(@time);
こんな感じですかね。
まず、分割しなきゃなんで、正規表現で。
月と曜日は今度は文字から数値に変換なんで、リスト使って1行変換とかは厳しいんで、
ハッシュ作って変換。
Time::Localは標準モジュールだけど、timegmはそのまま使える関数じゃないんで、useしないとダメ。