Changes between Version 31 and Version 32 of Perl


Ignore:
Timestamp:
04/11/07 10:13:01 (18 years ago)
Author:
atzm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Perl

    v31 v32  
    652652} 
    653653}}} 
     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 
     662use POSIX qw(strftime mktime locale_h); 
     663use POSIX::strptime; 
     664 
     665setlocale(LC_TIME, 'C'); 
     666 
     667my $date  = '08:52:20 JST Wed Apr 11 2007'; 
     668my $fmt   = '%H:%M:%S %Z %a %b %d %Y'; 
     669my @times = POSIX::strptime( $date, $fmt ); 
     670my $epoch = mktime( @times[0..5] ); 
     671 
     672print  "before: $date\n"; 
     673printf "after:  %s\n", strftime( $fmt, localtime($epoch) ); 
     674}}} 
     675{{{ 
     676#!sh 
     677$ perl hoge.pl  
     678before: 08:52:20 JST Wed Apr 11 2007 
     679after:  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 
     686use POSIX qw(strftime); 
     687use DateTime::Format::Strptime qw(strptime); 
     688 
     689my $date  = '08:52:20.343 JST Wed Apr 11 2007'; 
     690my $fmt   = '%H:%M:%S.%N %Z %a %b %d %Y'; 
     691my $dt    = strptime( $fmt, $date ); 
     692my $epoch = $dt->epoch(); 
     693 
     694print  "before: $date\n"; 
     695printf "after:  %s\n", strftime( $fmt, localtime($epoch) ); 
     696}}} 
     697{{{ 
     698#!sh 
     699$ perl hoge.pl 
     700before: 08:52:20.343 JST Wed Apr 11 2007 
     701after:  08:52:20.%N JST 水  4月 11 2007 
     702}}} 
     703   * こちらはナノ秒の解析も OK 
     704   * setlocale しなくてもよしなに解析してくれる 
     705   * 実行結果について補足 
     706     * 日本語で表示されているのは,になっているので POSIX の strftime が勝手に整形したから (ロケールが ja_JP になっているため) 
     707     * {{{%N}}} は POSIX の strptime がナノ秒を認識できないから