2015-10-31 11 views
7
#!/usr/bin/perl 
use DateTime; 

$a = DateTime->new(year=>1952,month=>10,day=>21); 
$b = DateTime->new(year=>2015,month=>10,day=>31); 

$dif = $b-$a; 

print $dif->years() ." ". $dif->months() ." ". $dif->days(); 
# result: 63 0 3 

Da dove vengono i 3 giorni? Mi aspetto 63 0 10.Perché questo perl DateTime matematica produce risultati imprevisti?

#!/usr/bin/perl 
use DateTime; 

$a = DateTime->new(year=>1952,month=>11,day=>1); 
$b = DateTime->new(year=>2015,month=>10,day=>31); 

$dif = $b-$a; 

print $dif->years() ." ". $dif->months() ." ". $dif->days(); 
# result 62 11 2 

mia aspettative per questo è 62 11 31 o così.

Sto provando a fare una data base di nascita per l'età. Il mese e l'anno sembrano funzionare come mi aspetto, ma la giornata sembra imprevedibile. Ho letto la documentazione CPAN ma ancora non capisco.

+6

Nota fuori tema: è meglio non utilizzare le variabili $ ae $ b, perché sono speciali in perl – red0ct

risposta

11

$dif->years, $diff->months e in particolare $diff->days non fare ciò che ci si aspetta. Dal DateTime::Duration documentation ...

Questi metodi restituiscono numeri indicano quante dell'unità in oggetto rappresenta, dopo aver fatto una conversione di qualsiasi unità più grandi. Per esempio , giorni vengono prima convertiti in settimane, quindi il resto è restituito. Questi numeri sono sempre positivi.

Ecco ciò che ogni metodo ritorna:

$dur->years()  == abs($dur->in_units('years')) 
$dur->months()  == abs(($dur->in_units('months', 'years'))[0]) 
$dur->weeks()  == abs($dur->in_units('weeks')) 
$dur->days()  == abs(($dur->in_units('days', 'weeks'))[0]) 

Se trovate questa confusione, anche a me

quello che vuoi è in_units.

# 63 0 10 
say join " ", $dif->in_units('years', 'months', 'days'); 
+1

Interessante. Quindi l'ipotesi di default nel pacchetto è che il numero di settimane sia interessante. I risultati predefiniti per giorni sono 'mod 7' di quanto ci si aspetterebbe normalmente. –

+1

Ottima risposta. Apprezzo molto che abbiate audace anche la documentazione pertinente. –

+0

@JeffY Sì, a DateTime piacciono le unità a lunghezza fissa. I problemi della matematica delle date sono trattati in [Come funziona DateTime Math] (https://metacpan.org/pod/DateTime#Datetime-Subtraction). La matematica del calendario è complicata. – Schwern

Problemi correlati