Perl - 如何转换日期?

时间:2011-07-07 19:15:41

标签: perl date format

如何转换日期格式YYYY-MM-DDTHH:MM:SSZ到YYYY-MM-DD HH:MM + 8小时?

例如:

Input: 2011-07-07T18:05:45Z

Output: 2011-07-08 02:05

5 个答案:

答案 0 :(得分:6)

让我们从Rahul的片段开始,添加日期数学和输出格式......

use DateTime; 
use DateTime::Format::ISO8601;

use DateTime::Format::Strptime;

my $string = '2011-07-07T18:05:45Z';
my $dt = DateTime::Format::ISO8601->parse_datetime( $string ); 
die "Impossible time" unless $dt;

my $formatter = new DateTime::Format::Strptime(pattern => '%Y-%m-%d %T');
$dt->add( hours => 8 )->set_formatter($formatter);
print "$dt\n";

我已经添加了DateTime :: Format :: Strptime的使用,以指定所需的输出格式。

然后我又添加了三行:

  1. 首先,我创建一个格式化程序,并将其输入我想要的输出模式。
  2. 接下来我在原始日期添加了8个小时,然后分配输出 通过将set_formatter()调用链接到add()调用来格式化。
  3. 然后我打印出来。

答案 1 :(得分:2)

您使用的是DateTime模块吗?

具体来说,这是DateTime::Format::ISO8601的链接,它读取/写入您提到的ISO 8601格式作为输入。

答案 2 :(得分:1)

如果你没有DateTime,你肯定有Time :: Piece:

use strict;
use warnings;

use Time::Piece;
use Time::Seconds qw(ONE_HOUR);

my $str = '2011-07-07T18:05:45Z';
my $t = Time::Piece->strptime($str, "%Y-%m-%dT%TZ");
$t += 8 * ONE_HOUR;
print $t->strftime("%Y-%m-%d %H:%M"),"\n";

答案 3 :(得分:0)

  

不起作用,结果是2010-02-28T15:21:33

然后,这样做很难......

use Time::Local
use warnings;
use strict;

$time = '2010-02-28T15:21:33Z';

my ($year, month, day) = split (/-/, $time)
$year -= 1900;   #Year is an offset of 1900
$month -= 1;     #Months are 0 - 11

#Now split the time off of the day (DDTHH:MM:SS)

$day = substr($day, 0, 2);
time = substr($day, 3)

#Now split the time

(my $hour, $minute, $second) = split(/:/, $time);

$second =~ s/Z$//;  #Remove Z

my $time_converted = timelocal($second, $minute, $hour, $day, $month, $year);

#Now you have the time, Add eight hours

my $hours_in_seconds = 8 * 60 * 60;
$time_converted += $hours_in_seconds;

# Almost done: Convert time back into the correct array:

($second, $minute, $hour, $day, $month, $year) = localtime($time_converted);

$year += 1900;
$month += 1;

# Now, reformat:

my $formatted_time = sprint (%04d-%02d-%02d %02d:%02d), 
    $year, $month, $day, $hour, $minute;

答案 4 :(得分:-1)

取自

How can I validate a "yyyy-MM-dd'T'HH:mm:ssZ" date/timestamp in UTC with Perl?

use DateTime; 
use DateTime::Format::ISO8601;
my $string = '2010-02-28T15:21:33Z';
my $dt = DateTime::Format::ISO8601->parse_datetime( $string ); die "Impossible time" unless $dt;