0

いくつか検索しましたが、コア Perl モジュールを使用してこれを正しく変換する方法がわかりません。2013-10-22T19:31:00Z2013 年 10 月 22 日と米国中部時間の時刻を取得したいと考えています。

4

3 に答える 3

4

これはコアモジュールのみを使用したソリューションです (まあ、少なくとも perl 5.8 が必要です):

use strict;
use POSIX qw(tzset strftime);
use Time::Local qw(timegm);

my $iso_time = "2013-10-22T19:31:00Z";
my $formatted_time;
{
    local $ENV{TZ} = "America/Chicago";
    tzset;
    if (my($y,$m,$d,$H,$M,$S) = $iso_time =~ m{^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$}) {
        $formatted_time = strftime '%m/%d/%Y %H:%M:%S', localtime timegm $S,$M,$H,$d,$m-1,$y;
    } else {
        # invalid ISO date, do something
    }
}
tzset; # restore default time zone handling

warn $formatted_time, "\n"; # output is "10/22/2013 14:31:00"

トリックについて一言TZ: 環境変数を設定することで、TZ時間関連の libc 関数 (例: localtime) は、デフォルトのタイム ゾーンの代わりにそのタイム ゾーンを使用します。TZ環境変数がプログラム内で設定されている場合はtzset()、内部の時間関連のデータ構造を調整するために呼び出す必要があります。tzset()データ構造を再度復元するためにもう一度呼び出すことを忘れないでください。

これは、ほとんどの Unix システムで機能するはずですが、Windows システムでは機能する場合と機能しない場合があります。

于 2013-10-22T21:11:27.857 に答える
3
use DateTime::Format::RFC3339  qw( );
use DateTime::Format::Strptime qw( );

my $in_dt_format = DateTime::Format::RFC3339->new();

my $out_dt_format = DateTime::Format::Strptime->new(
    pattern  => '%m/%d/%Y %H:%M:%S',
    on_error => 'croak',
);

my $dt = $in_dt_format->parse_datetime('2013-10-22T19:31:00Z');
$dt->set_time_zone('America/Chicago');
say $out_dt_format->format_datetime($dt);  # 10/22/2013 14:31:00
于 2013-10-22T19:51:14.903 に答える