0

我做了一些搜索,但不确定如何使用核心 Perl 模块正确转换。我有2013-10-22T19:31:00Z并且想要得到 2013 年 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 回答
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
于 2013-10-22T22:24:05.427 回答