top

TOP  RSS  Login

Perl - Time::Local

概要

ローカル時間や GMT 時間から、time() で得られるものと同様なエポックからの経過秒数を得る為の関数を提供するモジュール。標準モジュール。

デフォルトで、timelocal() と timegm() の二つの関数がエクスポートされる。これらはそれぞれ、Perl のビルトイン関数の localtime() や gmtime() の逆の動作を行う。

使い方

  • $time = timelocal(秒, 分, 時, 日, 月-1, 年);
  • $time = timegm(秒, 分, 時, 日, 月-1, 年);

それぞれ引数として (秒, 分, 時, 日, 月-1, 年) を渡す。月から 1 が引かれているのは、1 月を 0 として n 月は n-1 として表されるため。localtime() や gmtime() で返される月の数値が n-1 であるのと同じ。

use Time::Local;

my $t = timelocal(0,0,0,1,9-1,2000);
# 2000年9月1日 午前0時0分0秒 のエポック秒を得る

print scalar localtime $t;
# Fri Sep  1 00:00:00 2000
# 金曜日だ

その他

デフォルトでエクスポートされる二つの関数 timelocal() と timegm() は、引数がそれぞれ範囲内の値であるか(例えば、秒として渡す値が 0-59 の間にあるか)をチェックしている。このチェックを敢えて行わせない関数が、それぞれ _nocheck を付け足した関数 timelocal_nocheck() と timegm_nocheck() として提供されている。

use Time::Local qw(timelocal timelocal_nocheck);

$time = timelocal(166,95,2,81,44-1,1990);
# 1990年44月81日 2時95分166秒 -- 不正な時刻としてエラーとなる

$time = timelocal_nocheck(166,95,2,81,44-1,1990);
# エラーを起こさない

print scalar localtime $time;
# Sat Oct 20 03:37:46 1990

perldoc Time::Local によると、チェックを使用しないことで若干スピードアップが望めるが、返る値は予測不能であるため、引数の値がそれぞれ正しいことが明らかな場合以外は使わないように、とある。

考えられる使用法

"1993年3月18日 12時43分50秒" という文字列で示される時刻から、3198日と23時間32分33秒が経過した後の時刻を求める状況を考える。

この場合、文字列中の年・月・日・時・分・秒を示す数字からそれぞれの値 (1993, 3, 18, 12, 43, 50) を得ることができる。これらの値を用いて、まずエポックからの経過秒数を求めなければならないが、月によって日数が異なることや閏年が存在することなどを考慮すると、計算式が頭に入っていたりコピペでもしない限り面倒臭いことになる。そのために、時刻それぞれの値を用いて経過秒数を求める関数があれば便利というので Time::Local を利用する。

use Time::Local;

my @t = ("1993年3月18日 12時43分50秒" =~ m/([0-9]+)/g);
$t[1]--;

my $t = timelocal(reverse @t);

$t += (3198 * 60*60*24) + (23 * 60*60) + (32 * 60) + 33

print scalar localtime $t;

"Thu Dec 20 12:16:23 2001" で示される時刻のエポック経過秒数 "1008818183" を得られる。この値を用いて、日本語の文字列 "2001年12月20日 12時16分23秒" に変換したり、例えば stat() の引数として利用したりもできる。

リンク

Last modified:2008/11/29 03:20:20

dhp

0.362195