24
よくやった時間バグ @i47_rozary Perl beginners #10

20130927 perlbeginners 10 time-piece

Embed Size (px)

DESCRIPTION

Time::Piece を使っていて気をつけること。

Citation preview

Page 1: 20130927 perlbeginners 10 time-piece

よくやった時間バグ

@i47_rozary

Perl beginners #10

Page 2: 20130927 perlbeginners 10 time-piece

注意 !!

• Time::Pieceを中心に語ってます。• Time::Piece中心に偏ってます。

• 今までやってしまったバグ• 今まで周りの人がやったバグ

• だので、具体的 ?かと思います。

Page 3: 20130927 perlbeginners 10 time-piece

自己紹介

• 最近、あんまり Perl書いてません。• マネジメントばかりやってるんです orz=3

Page 4: 20130927 perlbeginners 10 time-piece

その前に

Page 5: 20130927 perlbeginners 10 time-piece

YAPC2013行って来ました。

Page 6: 20130927 perlbeginners 10 time-piece

蟲封祈願 !!

お守りって、 1 ” ”年くらいでお返ししますよね ?

だので、来年お守りをお返ししたら、潜在バグがワラワラ出てくるんじゃないのかと…。

ちょっと怖い想像してみた。

Page 7: 20130927 perlbeginners 10 time-piece

で、本題

Page 8: 20130927 perlbeginners 10 time-piece

アジェンダ

• Time::Pieceの紹介 (かるく )• Time::Pieceを使っていて起こすバグと対策をつらつらと。

Page 9: 20130927 perlbeginners 10 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

Page 10: 20130927 perlbeginners 10 time-piece

Time::Piece紹介

use Time::Piece;

my $t = localtime;

print “Year is ”, $t->year, “\n”;

#Year is 2013

Page 11: 20130927 perlbeginners 10 time-piece

かんたん !!

4行が 2行に !値の順番とか気にしない !

Page 12: 20130927 perlbeginners 10 time-piece

Time::Piece紹介

Perl 5.10から標準モジュールに入ってますぉ。

Page 13: 20130927 perlbeginners 10 time-piece

バグった話スタート

Page 14: 20130927 perlbeginners 10 time-piece

バグった 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

Page 15: 20130927 perlbeginners 10 time-piece

バグった 1

今のやつ同じだと思うじゃないですか。

say $t1->epoch;

#1380301200

say $t2->epoch;

#1380268800

タイムゾーンが、ずれてるんで epoch時間が違ってます。…時間の比較なんかしたらもうね 。

Page 16: 20130927 perlbeginners 10 time-piece

対策

基本的にlocaltime->strptime()を使うようにする。

弊社の人間は、恐らく 100%ハマってる。

Page 17: 20130927 perlbeginners 10 time-piece

バグった 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

Page 18: 20130927 perlbeginners 10 time-piece

バグった 2

了解、ハッハー !!

localtime使ってるぜー !!

say $t2->epoch;

#1380301200

Time::Pieceで strptimeした時の epochになっとるやないかー !!

Page 19: 20130927 perlbeginners 10 time-piece

対策

バージョン 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).

Page 20: 20130927 perlbeginners 10 time-piece

バグった 3

#現在時刻 :2013/09/27 17:00:00

my $t = Time::Piece->new;

$t += ONE_MONTH;

#2013-10-28T04:12:42

Page 21: 20130927 perlbeginners 10 time-piece

バグった 3

27日が 28日なっていたりと。

きっかり 1ヶ月ではない。

Page 22: 20130927 perlbeginners 10 time-piece

対策

年月を見る分には使える。

そらそうだよね、 1ヶ月の日数ってバラバラだもん。そこをどう捉えるかは、処理次第だよね ?

Page 23: 20130927 perlbeginners 10 time-piece

その他 バグった

• Time::Pieceをテストする時の epoch

• 24時間 (日またぎ )を超えるプロセスでの実行

• データリセット時間の設定

Page 24: 20130927 perlbeginners 10 time-piece

まとめ

時間の処理を本番環境で初めて動かすときは、リアルタイムで張り付いているといいよ !!

特に日またぎとかね !!