我做了一些搜索,我不知道如何使用核心Perl模块正确转换。我有2013-10-22T19:31:00Z
想要获得10/22/2013和美国中部时间的时间。
答案 0 :(得分: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
答案 1 :(得分:3)
这是一个仅使用核心模块的解决方案(嗯,你需要至少拥有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系统,也可能不适用。
答案 2 :(得分:2)
标准Perl模块?
那将包括Time::Piece,它自5.10以来一直是Perl的一部分。
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use Time::Piece;
my $date = "2013-10-22T19:31:00Z";
my $time = Time::Piece->strptime ( $date, "%Y-%m-%dT%H:%M:%SZ" );
$time = localtime($time); # Converts time to local time
say $time->mdy("/");
打印出来:
10/22/2013
那个古怪的"%Y-%m-%dT%H:%M:%SZ"
字符串代表你的时间输入格式。您可以在strftime的管理中找到它。
%Y
:四位数年份%m
:月份从01 - 12 %d
:01 - 31日%H
:00 - 23小时%M
:分钟从00 - 59 %S
:秒00-59