我有一个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中有一种简单的方法吗?
答案 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";