2015-12-16 1 views
1

У меня есть ISO 8601 время хранящийся в переменной и у меня есть некоторое количество часов, сохраненных в другой переменной, как это:Добавить время ISO 8601 раз в Perl

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

'$ current_time = @ _' присвоит число элементов в' @ _'. – choroba

+0

true, но я только передаю что-то одно, то есть current_time – user3270760

+0

Итак, это эквивалентно '$ current_time = 1'. Используйте 'shift' или' my ($ current_time) '. – choroba

ответ

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"; 
+1

Это добавило часы красиво, но конвертировало формат в 'Wed Jul 1 15:38:08 2015' Есть ли способ сохранить формат ISO 8061? – user3270760

+1

@ user3270760: См. Метод 'strftime'. – choroba

+1

Получил это: '$ new_time = $ new_time -> strftime ('% Y-% m-% dT% H:% M:% SZ'); '' в случае, если есть будущий интерес. Благодаря! – user3270760

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.

3

Вы также можете использовать Time::Moment. В интересах полного раскрытия я являюсь автором Time :: Moment.

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

Выход:

2015-07-01T16:38:08Z