WEBサイトの製作、管理、とかの日記ブログです。

<<   2023年05月   >>
SunMonTueWedThuFriSat
 123456
78910111213
14151617181920
21222324252627
28293031   
新着記事
カテゴリ
過去ログ
コメント
検索
モジュール使わずHTTP::Date
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しないとダメ。

この記事へのコメント
名前:
URL
コメント:
この記事へのトラックバック :
whblog 1.7