Perlの日時関連

最終更新日時:2007-07-31 15:11:24
Perl

標準


Perl 標準(インストール時)で用意されている時間関係の代表的なサブルーチンの使い方は以下のような感じです。

現在の時刻を表す秒数 (1970/1/1 からの通算秒 ) を返す。

 $t = time;
 $t = time - 86400; # 1日前


指定された秒数の locale を考慮した年月日時分秒等を返す。

 @t = localtime time; 	


このように Perl 標準で用意されているサブルーチンは、現在時刻の取得およびそれを用いた計算はできますが、例えばある特定の日時の1日前等、現在時刻以外の日時を起点とした計算を容易に行えるような環境は用意されていません。
そこで、現在時刻以外の日時を扱う際には自力で実装するか、他のモジュールを使用することとなります。

Time::Local


Time::Localは、現在時刻以外の日時を扱うことができる以下のメソッドが用意されており、use Time::Local することによりグローバルなサブルーチンとして使用することが可能になります。
CPANから取得できます。

指定された年月日時分秒に相当する秒数を locale を考慮して返す。

 $time = timelocal($sec,$min,$hour,$mday,$mon,$year);


指定された年月日時分秒に相当する秒数を locale を考慮せずに返す。

 $time = timegm($sec,$min,$hour,$mday,$mon,$year); 	


Class::Date


Class::Dateも日時を扱うPerlモジュールです。
他にも同様のモジュールはいくつかありますが、私はClass::Dateを使っています。
CPANから取得できます。
以下、簡単に使用方法です。

初期化


以下のように様々な初期化方法があります。

 $date = now;
 $date = new Class::Date [$year,$month,$day,$hour,$min,$sec];
 $date = Class::Date->new( [$year,$month] );
 $date = Class::Date::date(time);


Class::DBIと組み合わせ


以下のようなサブルーチンをClass::DBIのサブクラスに用意しておき、__PACKAGE__->has_a_datetime('updated_on');
のように宣言しておくと、型がdatetimeである項目を扱うのに便利です。

 sub has_a_datetime  {
    my ($class, @column) = @_;
    for my $column (@column) {
        $class->has_a(
            $column => 'Class::Date',
            inflate => sub {
                my ($datetime, $obj) = @_;
                return Class::Date::date($datetime);
            },
            deflate => 'string',
        );
    }
 }


お問い合わせは 掲示板 にて。