在Perl中为ISO 8601次添加时间

时间:2015-12-16 14:34:21

标签: perl iso

我有一个ISO 8601时间存储在一个变量中,我有一些小时存储在另一个变量中,如下所示:

my $current_time = shift; #looks like: 2015-07-01T15:38:08Z
my $hours = shift; # looks like: 12

我的目标是将小时数添加到当前时间,但似乎没有任何内置的Perl功能。在Powershell中,您可以执行以下操作:

$currentTime = $currentTime .AddHours($hours)

在Perl中有一种简单的方法吗?

3 个答案:

答案 0 :(得分:5)

特定的ISO 8601配置文件也称为RFC3339。

use DateTime::Format::RFC3339;

my $dt = DateTime::Format::RFC3339->parse_datetime('2015-07-01T15:38:08Z');
$dt->add( hours => 1 );
print "$dt\n";  # 2015-07-01T16:38:08Z

如果您想接受任意ISO 8601配置文件,您可以使用DateTime :: Format :: ISO8601。

use DateTime::Format::ISO8601;

my $dt = DateTime::Format::ISO8601->parse_datetime('2015-07-01T15:38:08Z');
$dt->set_time_zone('UTC');  # Convert to UTC ("Z") if it's not already.
$dt->add( hours => 1 );
print $dt->iso8601().'Z', "\n";  # 2015-07-01T16:38:08Z

我发布了这些替代方案,因为这些模块比Time :: Piece更不容易出错。

答案 1 :(得分:3)

您也可以使用Time::Moment。为了充分披露,我是Time :: Moment的作者。

say Time::Moment->from_string('2015-07-01T15:38:08Z')
                ->plus_hours(1);

输出:

2015-07-01T16:38:08Z

答案 2 :(得分:2)

Time::Piece非常容易:

#! /usr/bin/perl
use warnings;
use strict;

use Time::Piece;
use Time::Seconds;

my $current_time = '2015-07-01T15:38:08Z';
my $hours = 12;

my $format = '%Y-%m-%dT%H:%M:%SZ';
my $time = 'Time::Piece'->strptime($current_time, $format);
$time += $hours * ONE_HOUR;

print $time->strftime($format), "\n";