20130927 perlbeginners 10 time-piece
DESCRIPTION
Time::Piece を使っていて気をつけること。TRANSCRIPT
よくやった時間バグ
@i47_rozary
Perl beginners #10
注意 !!
• Time::Pieceを中心に語ってます。• Time::Piece中心に偏ってます。
• 今までやってしまったバグ• 今まで周りの人がやったバグ
• だので、具体的 ?かと思います。
自己紹介
• 最近、あんまり Perl書いてません。• マネジメントばかりやってるんです orz=3
その前に
YAPC2013行って来ました。
蟲封祈願 !!
お守りって、 1 ” ”年くらいでお返ししますよね ?
だので、来年お守りをお返ししたら、潜在バグがワラワラ出てくるんじゃないのかと…。
ちょっと怖い想像してみた。
で、本題
アジェンダ
• Time::Pieceの紹介 (かるく )• Time::Pieceを使っていて起こすバグと対策をつらつらと。
Time::Piece紹介
my $times = time();
my ($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
$year += 1900;
print “Year is ”, $year, “\n”;
#Year is 2013
Time::Piece紹介
use Time::Piece;
my $t = localtime;
print “Year is ”, $t->year, “\n”;
#Year is 2013
かんたん !!
4行が 2行に !値の順番とか気にしない !
Time::Piece紹介
Perl 5.10から標準モジュールに入ってますぉ。
バグった話スタート
バグった 1
my $t1 = Time::Piece->strptime("2013-09-27 17:00:00","%Y-%m-%d %H:%M:%S");
say $t1->datetime;
#2013-09-27T17:00:00
my $t2 = localtime->strptime("2013-09-27 17:00:00","%Y-%m-%d %H:%M:%S");
say $t2->datetime;
#2013-09-27T17:00:00
バグった 1
今のやつ同じだと思うじゃないですか。
say $t1->epoch;
#1380301200
say $t2->epoch;
#1380268800
タイムゾーンが、ずれてるんで epoch時間が違ってます。…時間の比較なんかしたらもうね 。
対策
基本的にlocaltime->strptime()を使うようにする。
弊社の人間は、恐らく 100%ハマってる。
バグった 2
my $t2 = localtime->strptime("2013-09-27 17:00:00","%Y-%m-%d %H:%M:%S");
say $t2->datetime;
#2013-09-27T17:00:00
* Version 1.15
バグった 2
了解、ハッハー !!
localtime使ってるぜー !!
say $t2->epoch;
#1380301200
Time::Pieceで strptimeした時の epochになっとるやないかー !!
対策
バージョン 1.15以前は使うな !!1.16の Changesに書いてある。Implement %z for the internal implementation of strptime().
Unfortunately this doesn't get picked up everywhere, so there are no
tests for it (yet - patches welcome).
バグった 3
#現在時刻 :2013/09/27 17:00:00
my $t = Time::Piece->new;
$t += ONE_MONTH;
#2013-10-28T04:12:42
バグった 3
27日が 28日なっていたりと。
きっかり 1ヶ月ではない。
対策
年月を見る分には使える。
そらそうだよね、 1ヶ月の日数ってバラバラだもん。そこをどう捉えるかは、処理次第だよね ?
その他 バグった
• Time::Pieceをテストする時の epoch
• 24時間 (日またぎ )を超えるプロセスでの実行
• データリセット時間の設定
まとめ
時間の処理を本番環境で初めて動かすときは、リアルタイムで張り付いているといいよ !!
特に日またぎとかね !!