概要

  • GMT を CPAN:HTTP-Date および Perl 標準機能のみを使ってローカルタイムに変換する。
  • GMTtoLocal2 は時差の指定は無視する。

ソース

  • GMTtoLocal.zip
    #!/usr/bin/perl
    # GMT からローカルタイム(JST)に変換
    
    use strict;
    use warnings;
    use utf8;
    use Encode;
    use HTTP::Date qw( time2str str2time time2iso );
    use POSIX qw(strftime);
    use Time::Local;
    
    my $charsetConsole	= 'CP932';
    my $charsetFile		= 'UTF-8';
    
    binmode( STDIN,  ":encoding($charsetConsole)" );
    binmode( STDOUT, ":encoding($charsetConsole)" );
    binmode( STDERR, ":encoding($charsetConsole)" );
    
    my @sample = ( 
    	'2011-11-23T00:00:00Z', 
    	'2011-12-31T20:00:00Z', 
    	'2012-02-28T21:00:00+00:00', 
    	'2012-02-28T21:00:00+09:00', 
    );
    
    foreach my $src ( @sample ){
    	printf( "Source\t\t%s\nHTTP::Date\t%s\nStandard\t%s\n\n", 
    		$src, GMTtoLocal1( $src ), GMTtoLocal2( $src ) );
    }
    
    exit();
    
    # HTTP::Date を使用
    # http://search.cpan.org/dist/HTTP-Date/
    sub GMTtoLocal1
    {
    	my( $gmt ) = @_;
    	return time2iso( str2time( $gmt, 'Asia/Tokyo' ) );
    }
    
    # Perl標準機能のみ
    # http://chalow.net/2010-03-01-5.html
    # 時差の指定は無視して常にGMTと見なす。
    sub GMTtoLocal2
    {
    	my( $gmt ) = @_;
    	my $ret = $gmt;
    	if ( $gmt =~ /^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)/ ){
    		my $utm = timegm( $6, $5, $4, $3, $2-1, $1 );
    		$ret = strftime( "%Y-%m-%d %H:%M:%S", localtime( $utm ) );
    	}
    	return $ret;
    }
    
    # EOF

出力

Source		2011-11-23T00:00:00Z
HTTP::Date	2011-11-23 09:00:00
Standard	2011-11-23 09:00:00

Source		2011-12-31T20:00:00Z
HTTP::Date	2012-01-01 05:00:00
Standard	2012-01-01 05:00:00

Source		2012-02-28T21:00:00+00:00
HTTP::Date	2012-02-29 06:00:00
Standard	2012-02-29 06:00:00

Source		2012-02-28T21:00:00+09:00
HTTP::Date	2012-02-28 21:00:00
Standard	2012-02-29 06:00:00

リンク