2015-12-16 1 views
1

je ISO 8601 le temps stocké dans une variable et j'ai un certain nombre d'heures stockées dans une autre variable comme ceci:Ajouter du temps à la norme ISO 8601 fois en Perl

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

Mon but est d'ajouter les heures à l'heure actuelle, mais il ne semble pas y avoir de fonction Perl intégrée pour le faire. Dans Powershell, vous pouvez faire quelque chose comme ceci:

$currentTime = $currentTime .AddHours($hours) 

Y a-t-il un moyen facile de faire cela en Perl?

+0

'$ current_time = @ _' attribuera le nombre d'éléments dans' @ _'. – choroba

+0

vrai, mais je ne fais que passer dans une chose, qui est le current_time – user3270760

+0

Donc, c'est équivalent à '$ current_time = 1'. Utilisez 'shift' ou' my ($ current_time) '. – choroba

Répondre

2

plutôt facile avec 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

Cela a ajouté les heures magnifiquement, mais il a converti le format à «Wed Jul 1 15:38:08 2015» Y at-il un moyen de préserver le format ISO 8061? – user3270760

+1

@ user3270760: Voir la méthode 'strftime'. – choroba

+1

Got it: '$ new_time = $ new_time -> strftime ('% Y-% m-% dT% H:% M:% SZ'); '' dans le cas où il y a un intérêt futur. Merci! – user3270760

5

Ce profil spécifique ISO 8601 est également connu sous le nom 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 

Si vous souhaitez accepter arbitraire des profils ISO 8601, vous pouvez utiliser 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 

J'ai publié ces alternatives parce que ces modules sont beaucoup moins sujettes aux erreurs que Time :: Piece.

3

Vous pouvez également utiliser Time::Moment. Dans l'intérêt de la divulgation complète, je suis l'auteur de Time :: Moment.

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

Sortie:

2015-07-01T16:38:08Z