Perl Snippets

Perl の Unix タイムスタンプ スニペット

time() での現在の Unix タイムスタンプの取得、POSIX::strftime() での日付の整形、Time::Local での暦日からエポック秒への逆変換を行う Perl の例。

Current Unix timestamp (seconds)
my $ts = time();
Current Unix timestamp (milliseconds)
use Time::HiRes qw(time);
my $ms = int(time() * 1000);
Format timestamp as UTC string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", gmtime(1700000000));
# "2023-11-15 06:13:20"
Format timestamp as local time string
use POSIX qw(strftime);
my $str = strftime("%Y-%m-%d %H:%M:%S", localtime(1700000000));
Timestamp from date components (UTC)
use Time::Local qw(timegm);
# timegm(sec, min, hour, mday, mon, year)
# mon is 0-indexed: 10 = November
my $ts = timegm(20, 13, 6, 15, 10, 2023);
Timestamp from date components (local)
use Time::Local qw(timelocal);
my $ts = timelocal(20, 13, 6, 15, 10, 2023);
Parse ISO date string to timestamp
use Time::Piece;
my $t = Time::Piece->strptime("2023-11-15T06:13:20Z", "%Y-%m-%dT%H:%M:%SZ");
my $ts = $t->epoch;

Perl のタイムスタンプの基本

Perl の組み込み関数 time() は、エポックからの整数秒数として現在の Unix タイムスタンプを返します。組み込みの localtime() と gmtime() は、タイムスタンプを暦の値のリスト(秒、分、時、日、月、年、曜日、年内通算日、DST フラグ)に変換します。gmtime/localtime の月は 0 始まり(0 = 1 月)で、年は 1900 年からの年数です。

整形と解析

POSIX モジュールはすべての標準 Perl インストールに付属し、C と同じフォーマットコードでタイムスタンプを整形する strftime() を提供します。秒未満の精度には、Time::HiRes(Perl 5.8 以降コアにも含まれる)が time() と sleep() を上書きして浮動小数点値を受け付けるようにします。Time::Piece(Perl 5.10 以降コア)は strptime() によるオブジェクト指向の解析を追加します。

Perl の本番運用メモ

Perl の time() はネイティブの整数を返すため、64 ビットの Perl ビルドでは 2038 年問題のオーバーフローの影響を受けません。32 ビットの Perl ビルドでは time_t は依然 32 ビットです。Config モジュールの $Config{ivsize} を確認してください。暦の構成要素から UTC タイムスタンプを作るときは、引数をローカル時刻として解釈する timelocal() ではなく、Time::Local の timegm() を使います。

  • Time::HiRes、POSIX、Time::Local はいずれもコアモジュールでインストール不要
  • timegm() と timelocal() の月引数は 0 始まり:11 月には 10 を渡す
  • 年引数は 1900 年からの年数:2023 年には 123 を渡す
  • 任意の日付文字列の解析には、手動の正規表現分割ではなく Time::Piece->strptime を使う

FAQ

なぜ localtime() は文字列ではなくリストを返すのか?
リストコンテキストでは localtime($ts) は (sec, min, hour, mday, mon, year, wday, yday, isdst) を返します。スカラーコンテキストでは ctime 形式の文字列を返します。リストからカスタム整形した文字列を作るには POSIX::strftime を使ってください。
Perl で 1 秒未満のタイムスタンプを得るには?
Time::HiRes を使います:'use Time::HiRes qw(time); my $ms = int(time() * 1000);'。このモジュールは Perl のコアモジュールなので CPAN からのインストールは不要です。