J'essaie de calculer le nombre de jours calendaires entre deux dates extraites d'une base de données. Je pensais que la conversion des dates en secondes serait une solution simple et correcte.
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$
3 Réponses :
Une alternative est DateTime . Ce n'est pas dans le noyau, mais c'est souvent très pratique. Parce que cela n'utilise pas les dates, nous avons rapidement fait notre propre fonction d'analyse.
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
Cela analyse les dates. DateTime :: Format :: Strptime est la plus flexible, mais DateTime :: Format :: ISO8601 est probablement le plus simple dans ce cas.
@ikegami Ouais si vous en charge un de ceux-ci. Mais il dit Ce module n'utilise pas les dates i> . ..;)
Par cette logique, DateTime ne sait rien des fuseaux horaires car toutes ces informations de fuseau horaire sont dans une autre distribution. C'est plutôt idiot.
Ce n'est pas ma logique. Je venais de citer. ;-)
Vous faites l'hypothèse invalide que chaque jour est de 86 400 secondes de long. P>
S'il vous plaît aller à http://www.timeanddate.com/time/dst/2016 .html et regarde tous les endroits où l'heure d'été (Aka Heure d'été) commence le 27 mars 2016. Ce jour-là n'est pas de 86 400 secondes de long. P>
Pourquoi ne pas le faire directement dans votre requête de base de données?
En fait, j'apprends comment gérer les dates à Perl. La curiosité et la familiarisation avec Perl sont les principaux pilotes.
Ressemble à une erreur de temps d'été d'une journée. Je n'ai pas vérifié mon calendrier pour voir si c'est le problème.
@Ga MmeEeu, en utilisant
str2time ($ DATUM, 'UTC') code> (même s'il s'agit d'une heure locale) au lieu de
str2time ($ datum) code> donnera la bonne réponse. C'est le temps d'astuce :: pièce utilise la pièce. Mais ne fais pas ça. Utilisez un module conçu pour la date d'arithmétique.