Próbuję obliczyć liczbę dni kalendarzowych między dwiema datami wyodrębnionymi z bazy danych. Pomyślałem, że konwersja dat na sekundy będzie prostym i poprawnym rozwiązaniem.Perl: Oblicz liczbę dni przez konwersję na sekundy
#!/usr/bin/perl
use warnings;
use strict;
use POSIX qw(strftime);
use Date::Parse;
my $minDate = "2016-03-27";
my $maxDate = "2016-06-15";
print "Format as extracted from db: mindate: $minDate and maxdate: $maxDate\n";
my ($dbYear,$dbMonth,$dbDay) = split ('-', $minDate);
my $datum = "$dbYear$dbMonth$dbDay";
my $minDateSec = str2time($datum);
($dbYear,$dbMonth,$dbDay) = split ('-', $maxDate);
$datum = "$dbYear$dbMonth$dbDay";
my $maxDateSec = str2time($datum);
my $numCalDaysSec = ($maxDateSec-$minDateSec)/86400;
print "Min date in Seconds: $minDateSec\n";
print "Max date in Seconds: $maxDateSec\n";
print "Num days: $numCalDaysSec\n";
Początkowo myślałem, że metoda ta dostarczyła mi wiarygodnych wyników:
bash-3.2$ ./testNumDays.pl
As extracted from db: mindate: 2016-06-14 and maxdate: 2016-06-15
Min date in Seconds: 1465855200
Max date in Seconds: 1465941600
Num days: 1
bash-3.2$ ./testNumDays.pl
As extracted from db: mindate: 2016-05-31 and maxdate: 2016-06-15
Min date in Seconds: 1464645600
Max date in Seconds: 1465941600
Num days: 15
bash-3.2$ ./testNumDays.pl
As extracted from db: mindate: 2016-03-28 and maxdate: 2016-06-15
Min date in Seconds: 1459116000
Max date in Seconds: 1465941600
Num days: 79
bash-3.2$ ./testNumDays.pl
As extracted from db: mindate: 2016-03-27 and maxdate: 2016-06-15
Min date in Seconds: 1459033200
Max date in Seconds: 1465941600
Num days: 79.9583333333333
bash-3.2$
Oczywiście, liczba dat kalendarzowych od daty powinien być liczbą całkowitą. Mmmm, co robię źle? Dlaczego przeliczanie na sekundy nie jest niezawodne?
Ponieważ jestem nowicjuszem Perl, prawdopodobnie przeoczyłem oczywistość. Każda pomoc jest zatem mile widziane.
Dlaczego nie zrobić tego bezpośrednio w zapytaniu do bazy danych? – ThisSuitIsBlackNot
W rzeczywistości uczę się obsługiwać daty w Perlu. Ciekawość i zapoznanie się z Perlem są głównymi motorami. –
Wygląda jak błąd czasu letniego. Nie sprawdziłem mojego kalendarza, aby sprawdzić, czy to jest problem. – hymie