UNIX 秒をローカル時間に変換する
localtime
は、リストコンテキスト (戻り値をリストで受け取る状況) の場合、
EXPR に与えらえれた UNIX 秒からローカルのタイムゾーンにおける日時を割り出し、
その結果を 9 つ値を持つリストとして返します。
引数 EXPR が省略されたら、現在日時を表す UNIX 秒
(time
から得られる値) が適用されます。
返されるリストのそれぞれの値の意味は次の通りです。
# | 意味 |
---|---|
0 | 秒 (0 ~ 59) |
1 | 分 (0 ~ 59) |
2 | 時 (0 ~ 23) |
3 | 日 (1 ~ 31) |
4 | 月 (0 ~ 11, 1 月は 0, 12 月は 11) |
5 | 西暦 1900 年からの経過年数 |
6 | 曜日 (0 ~ 6, 日曜日は 0, 土曜日は 6) |
7 | 1 月 1 日からの経過日数 (該当日が 1 月 1 日 なら 0, 1 月 2 日なら 1) |
8 | 夏時間 (Daylight Saving Time) なら 1, そうでなければ 0 |
use utf8;
binmode STDOUT, ":utf8";
my @tm = localtime(time);
# 今日の日付
my $year = $tm[5] + 1900; # 西暦
my $mon = $tm[4] + 1; # 月
my $mday = $tm[3]; # 日
my $wday = $tm[6];
my @youbi_list = ( '日', '月', '火', '水', '木', '金', '土' );
my $youbi = $youbi_list[$wday]; # 曜日
print "今日は ${year}年${mon}月${mday}日 (${youbi}) です。\n";
# 今の時刻
my $hour = $tm[2];
my $min = $tm[1];
my $sec = $tm[0];
print "今は ${hour}時${min}分${sec}秒です。\n";
# 1 月 1 日からの経過日数
my $yday = $tm[7];
print "今日は 1 月 1 日から数えて ${yday} 日目です。\n";
# 夏時間かどうか
my $isdst = $tm[8];
if ($isdst) {
print "今日は夏時間です。\n";
}
else {
print "今日は夏時間ではありません。\n";
}
上記コードは次のような結果を出力します。
今日は 2023年5月16日 (火) です。
今は 15時16分57秒です。
今日は 1 月 1 日から数えて 135 日目です。
今日は夏時間ではありません。
月は 1 ~ 12 ではなく 0 ~ 11 が返ってくる点に注意してください。
西暦に該当する値は西暦 1900 年からの経過年数です。従って、現在の西暦を求める際には、得られた値に 1900 を加算してください。
曜日に該当する値は 0 ~ 6 の整数ですが、0 は日曜日を表し、6 は土曜日を表します。
1 月 1 日からの経過日数は、通常は 0 ~ 364 の整数になりますが、うるう年の場合は最大で 365 になります。
localtime
は、スカラーコンテキスト (戻り値をスカラー変数で受け取る状況) の場合、
英語表記の現在日時文字列を返します。
my $now = localtime(time);
print $now; # Tue May 16 15:28:00 2023
もしローカル時間ではなく GMT を扱いたいなら、localtime
の代わりに
gmtime
を使ってください。