2020-01-08

[]Time::Localのバグっぽい仕様

My Y2020 Bug | Tom Wyant [blogs.perl.org]

http://blogs.perl.org/users/tom_wyant/2020/01/my-y2020-bug.html

以下のコードを実行すると、1970-01-01が欲しい所に、2070-01-01が返ってくるという問題

https://ideone.com/OOD6yU

#!/usr/bin/perl
use 5.028;
use warnings;
use POSIX qw(strftime);
use Time::Local;

my $t = timegm(0, 0, 0, 1, 0, 70);
say strftime("%Y-%m-%d %H:%M:%S", gmtime($t));

2070-01-01 00:00:00

https://metacpan.org/pod/Time::Local#Year-Value-Interpretation

Years in the range 0..99 are interpreted as shorthand for years in the rolling "current century," defined as 50 years on either side of the current year.

(snip)

Whenever possible, use an absolute four digit year instead.

Time::Localの仕様として、年数に2桁の値を与えた場合19xx年と20xx年、現在時間から近い年を取るらしい。

70を与えた場合、今は2020年1月8日なので、1970年ではなく、2070年が取られる模様。

対策としては、ドキュメントにあるように、年数は4桁で与えるようにするのが良いと思う。

  • Perlが保守できるフレンズ

  • つまり、これからは 70年代の話をするときは、2070年代の話しなんだなって 考えないといかんってことだね。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん