Perl: calculate the number of days in seconds

I am trying to calculate the number of calendar days between two dates retrieved from a database. I thought converting dates to seconds would be a simple and correct solution.

#!/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"; 

At first I thought that this method gave me reliable results:

 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$ 

Obviously, the number of calendar dates between dates must be an integer. Mmmm, what am I doing wrong? Why is conversion to seconds not reliable?

Since I'm new to Perl, I probably don't notice the obvious. Therefore any help is appreciated.

+6
source share
3 answers

One way is to use Time :: Piece. The main module:

 use warnings; use strict; use Time::Piece qw(); my $t1 = Time::Piece->strptime('2016-03-27', '%Y-%m-%d'); my $t2 = Time::Piece->strptime('2016-06-15', '%Y-%m-%d'); my $seconds = $t2 - $t1; print $seconds->days(), "\n"; __END__ 80 
+7
source

An alternative is DateTime . This is not in Core, but it is often very convenient. Since it does not parse dates, we quickly made our own parsing function.

 use strict; use warnings; use DateTime; my $minDate = "2016-03-27"; my $maxDate = "2016-06-15"; sub parse { my $date = shift; my ( $y, $m, $d ) = split /-/, $date; return DateTime->new( year => $y, month => $m, day => $d ); } my $days = parse($minDate)->delta_days(parse($maxDate))->in_units('days'); print $days; __END__ 80 
+5
source

You make the wrong assumption that every day is 86,400 seconds.

Go to http://www.timeanddate.com/time/dst/2016.html and see all the places where daylight saving time (daylight saving time) begins on March 27, 2016. This day does not last 86,400 seconds.

+3
source

All Articles