20130927 perlbeginners 10 time-piece

585 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
585
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

20130927 perlbeginners 10 time-piece

  1. 1. よくやった時間バグ @i47_rozary Perl beginners #10
  2. 2. 注意 !! • Time::Piece を中心に語ってます。 • Time::Piece 中心に偏ってます。 • 今までやってしまったバグ • 今まで周りの人がやったバグ • だので、具体的 ? かと思います。
  3. 3. 自己紹介 • 最近、あんまり Perl 書いてません。 • マネジメントばかりやってるんです orz=3
  4. 4. その前に
  5. 5. YAPC2013 行って来ました。
  6. 6. 蟲封祈願 !! お守りって、 1 年くらいで”お返し”しますよ ね? だので、来年お守りをお返ししたら、潜在 バグがワラワラ出てくるんじゃないのかと …。 ちょっと怖い想像してみた。
  7. 7. で、本題
  8. 8. アジェンダ • Time::Piece の紹介 ( かるく ) • Time::Piece を使っていて起こすバグと対 策をつらつらと。
  9. 9. 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
  10. 10. Time::Piece 紹介 use Time::Piece; my $t = localtime; print “Year is ”, $t->year, “n”; #Year is 2013
  11. 11. かんた ん !! 4 行が 2 行に ! 値の順番とか気にしない !
  12. 12. Time::Piece 紹介 Perl 5.10 から標準モジュールに入ってま すぉ。
  13. 13. バグった 話 スタート
  14. 14. バグった 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
  15. 15. バグった 1 今のやつ同じだと思うじゃないですか。 say $t1->epoch; #1380301200 say $t2->epoch; #1380268800 タイムゾーンが、ずれてるんで epoch 時間が違ってます。 時間の比較なんかしたらもうね…。
  16. 16. 対策 基本的に localtime->strptime() を使うようにする。 弊社の人間は、恐らく 100% ハマってる。
  17. 17. バグった 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
  18. 18. バグった 2 了解、ハッハー !! localtime 使ってるぜー !! say $t2->epoch; #1380301200 Time::Piece で strptime した時の epoch になっとるやない かー !!
  19. 19. 対策 バージョン 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).
  20. 20. バグった 3 # 現在時刻 :2013/09/27 17:00:00 my $t = Time::Piece->new; $t += ONE_MONTH; #2013-10-28T04:12:42
  21. 21. バグった 3 27 日が 28 日なっていたりと。 きっかり 1 ヶ月ではない。
  22. 22. 対策 年月を見る分には使える。 そらそうだよね、 1 ヶ月の日数ってバラバラだもん。 そこをどう捉えるかは、処理次第だよね ?
  23. 23. その他 バグった • Time::Piece をテストする時の epoch • 24 時間 ( 日またぎ ) を超えるプロセスでの 実行 • データリセット時間の設定
  24. 24. まとめ 時間の処理を本番環境で 初めて動かすときは、 リアルタイムで張り付いているといいよ !! 特に日またぎとかね !!

×