| | 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 がナノ秒を認識できないから |