2010-08-02 5 views
4
use DateTime ; 

my $date = "2010-08-02 09:10:08"; 

my $dt = DateTime->now(time_zone => 'local')->set_time_zone('floating'); 
print $dt->subtract_datetime($date); 

Cela ne fonctionne pas; quel est le problème?Comment calculer une différence DateTime en Perl?

Le message d'erreur est:

Can't call method "time_zone" without a package or object reference at 
/opt/perl/perl5.12/lib/site_perl/5.12.0/x86_64-linux/DateTime.pm line 1338 
+0

définissez votre $ data var comme datetime: my $ date = DateHeure-> nouvelle (année => 2010, mois => 8, jour => 2, heure => 9, minute => 10, seconde => 8); – benzebuth

Répondre

18

Vous devez convertir des chaînes de date en objets DateTime d'abord, en utilisant un format personnalisé ou l'un des nombreux DateTime :: Format :: * bibliothèques disponibles. Vous utilisez un format couramment utilisé dans les bases de données, donc j'ai choisi le formatter MySQL (puis défini une formatter durée personnalisée pour le résultat final, copié des exemples DateTime::Format::Duration):

use DateTime; 
use DateTime::Format::MySQL; 
use DateTime::Format::Duration; 

my $date = "2010-08-02 09:10:08"; 

my $dt1 = DateTime->now(time_zone => 'floating', formatter => 'DateTime::Format::MySQL'); 
my $dt2 = DateTime::Format::MySQL->parse_datetime($date); 

my $duration = $dt1 - $dt2; 
my $format = DateTime::Format::Duration->new(
    pattern => '%Y years, %m months, %e days, %H hours, %M minutes, %S seconds' 
); 
print $format->format_duration($duration); 

# prints: 
# 0 years, 00 months, 0 days, 00 hours, 421 minutes, 03 seconds 
3
bien

, à première vue, je pense que $dt->subtract_datetime(...) fonctionnera si vous soustrayez deux objets DateTime.
-à-dire: votre $date devrait être un datetime

6

$date doit être un objet DateTime, pas une chaîne simple. Voir DateTime. Et, vous ne pouvez pas simplement imprimer la valeur de retour de subtract_datetime car il renvoie une référence. Vous devez utiliser les méthodes , telles que hours, pour extraire des informations utiles.

use strict; 
use warnings; 
use DateTime; 

my $dt2 = DateTime->new(
         year => 2010, 
         month => 8, 
         day => 2, 
         hour => 9, 
         minute => 10, 
         second => 8, 
         time_zone => 'local', 
        ); 

my $dt1 = DateTime->now(time_zone => 'local')->set_time_zone('floating'); 

my $dur = $dt1->subtract_datetime($dt2); 
print 'hours = ', $dur->hours(), "\n"; 

__END__ 

hours = 2 
Questions connexes