2011-08-16 10 views
5

Tengo un pequeño problema restando dos objetos de fecha y hora de la otra. Yo uso el siguiente código:Perl Datetime problema de resta


    $today = DateTime->now(time_zone => 'Europe/Berlin'); 

    my $dt1 = DateTime-> new (
        year => 2011, 
        month => 08, 
        day => 08, 
        hour => 1, 
        minute => 0, 
        second => 4, 
        time_zone =>'Europe/Berlin' 
        ); 

    print "DT1 : $dt1\n"; 
    print "today: $today\n"; 

    my $sub = $today->subtract_datetime($dt1); 

    print "sub days: ".$sub->days."\n"; 

La declaración de impresión para DT1 y hoy en día impresiones:

DT1 : 2011-08-08T01:00:04 
today: 2011-08-16T08:34:10 

Pero si puedo imprimir después de la sustracción del valor $sub->days Muestra en lugar de día .

¿Tengo un error en mi resta?

Muchas gracias por su ayuda.

Respuesta

5

El DateTime::Duration no funciona como usted (y yo) que se espera. Comprobar todos los campos de $sub:

DT1 : 2011-08-08T01:00:04 
today: 2011-08-16T09:02:11 
$sub->years: 0 
$sub->months: 0 
$sub->weeks: 1 
$sub->days: 1 
$sub->hours: 8 
$sub->minutes: 2 
$sub->seconds: 7 

La diferencia entre las dos fechas es 1 semana + 1 día, los esperados ocho días.

Si desea que la diferencia en días, trate $today->delta_days($dt1). El método delta_days() devuelve una duración que contiene solo días (edición) y semanas, pero no meses.

+0

Hola Anders, muchas gracias por su ayuda. – Stefan

+3

No del todo. 'delta_days' todavía devuelve semanas y días, por lo que aún necesita usar' in_units'. La diferencia es que no devolverá meses, que no pueden convertirse en días. – ikegami

+0

He resuelto que a través de una cláusula if para comprobar: si $ sub> semanas> 0 días y luego $ = $ sub> semanas * 7 + $ sub> días – Stefan

0

La duración resultante es de 1 semana y 1 día. Semanas se pueden convertir de forma segura a día, para que pueda obtener el resultado deseado usando

$dur->in_units('days') 

Tenga en cuenta que meses no pueden ser convertidos en día, y resta pueden producir duraciones de meses. Como tal, usted realmente desea utilizar

my $dur = $today->delta_days($dt1); 
print "sub days: ".$dur->in_units('days')."\n"; 

PS — 08 es un error:

Illegal octal digit '8' at a.pl line 7, at end of line 
Illegal octal digit '8' at a.pl line 8, at end of line 

gota el cero inicial.