引き続き、Apacheのログ解析で時間の処理を、Time::Localモジュールのtimelocal関数を用いて行います。
ログファイルで” 04/Jun/2007:10:01:46″となっている時間表記を、UNIXシステムの標準である”1970/01/01:00:00:00からの経過秒数”で表した表記に変換します。
use Time::Local; my %MONTH = ( 'Jan', 0, 'Feb', 1, 'Mar', 2, 'Apr', 3, 'May', 4, 'Jun', 5, 'Jul', 6, 'Aug', 7, 'Sep', 8, 'Oct', 9, 'Nov', 10, 'Dec', 11 ); my ($day, $mon, $year) = split( /\//, $date ); my ($hour, $min, $sec) = split( /\:/, $time ); my $t = timelocal($sec, $min, $hour, $mday, $MONTH{$mon}, $year - 1900);
ここでの注意点は、月は0から始まること(1月は0)と、西暦から1900を引くことです。
逆に、あるtimelocal値(上記例の$t)から日時を求める関数がlocaltime。
この関数は、Perlにもともと組み込まれています。
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($t);
$wdayは曜日(0=日曜日)、$ydayはその年の1月1日からの日数(0=1/1)、$isdstはサマータイムの有無(0/1)。
引数の$tを省略すると、現在時刻になります。
コメント