Perlにおける時間(localtime/timelocal)の処理

引き続き、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を省略すると、現在時刻になります。

参考
SBP:近藤嘉雪の「Perl News Letter」

コメント

タイトルとURLをコピーしました