| 654 | |
| 655 | == 時刻/日付操作 == |
| 656 | === strptime === |
| 657 | ふざけたことに標準では strptime を使うことができないので,以下のいずれかを別途インストールする必要がある. |
| 658 | 両者で strptime 関数への引数の順番が違うので注意. |
| 659 | * [http://search.cpan.org/dist/POSIX-strptime/lib/POSIX/strptime.pm POSIX::strptime] |
| 660 | {{{ |
| 661 | #!perl |
| 662 | use POSIX qw(strftime mktime locale_h); |
| 663 | use POSIX::strptime; |
| 664 | |
| 665 | setlocale(LC_TIME, 'C'); |
| 666 | |
| 667 | my $date = '08:52:20 JST Wed Apr 11 2007'; |
| 668 | my $fmt = '%H:%M:%S %Z %a %b %d %Y'; |
| 669 | my @times = POSIX::strptime( $date, $fmt ); |
| 670 | my $epoch = mktime( @times[0..5] ); |
| 671 | |
| 672 | print "before: $date\n"; |
| 673 | printf "after: %s\n", strftime( $fmt, localtime($epoch) ); |
| 674 | }}} |
| 675 | {{{ |
| 676 | #!sh |
| 677 | $ perl hoge.pl |
| 678 | before: 08:52:20 JST Wed Apr 11 2007 |
| 679 | after: 08:52:20 JST Wed Apr 11 2007 |
| 680 | }}} |
| 681 | * POSIX の strptime ではナノ秒の解析はできない |
| 682 | * setlocale しないとバグる可能性大なので注意 |
| 683 | * [http://search.cpan.org/dist/DateTime-Format-Strptime/lib/DateTime/Format/Strptime.pm DateTime::Format::Strptime] |
| 684 | {{{ |
| 685 | #!perl |
| 686 | use POSIX qw(strftime); |
| 687 | use DateTime::Format::Strptime qw(strptime); |
| 688 | |
| 689 | my $date = '08:52:20.343 JST Wed Apr 11 2007'; |
| 690 | my $fmt = '%H:%M:%S.%N %Z %a %b %d %Y'; |
| 691 | my $dt = strptime( $fmt, $date ); |
| 692 | my $epoch = $dt->epoch(); |
| 693 | |
| 694 | print "before: $date\n"; |
| 695 | printf "after: %s\n", strftime( $fmt, localtime($epoch) ); |
| 696 | }}} |
| 697 | {{{ |
| 698 | #!sh |
| 699 | $ perl hoge.pl |
| 700 | before: 08:52:20.343 JST Wed Apr 11 2007 |
| 701 | after: 08:52:20.%N JST 水 4月 11 2007 |
| 702 | }}} |
| 703 | * こちらはナノ秒の解析も OK |
| 704 | * setlocale しなくてもよしなに解析してくれる |
| 705 | * 実行結果について補足 |
| 706 | * 日本語で表示されているのは,になっているので POSIX の strftime が勝手に整形したから (ロケールが ja_JP になっているため) |
| 707 | * {{{%N}}} は POSIX の strptime がナノ秒を認識できないから |