6
votes

Perl: calculer le nombre de jours en convertissant en secondes

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$


4 commentaires

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') (même s'il s'agit d'une heure locale) au lieu de str2time ($ datum) 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.


3 Réponses :


7
votes

Un moyen est d'utiliser le Time :: Pièce Module de base: XXX


0 commentaires

5
votes

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


4 commentaires

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 . ..;)


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. ;-)



3
votes

Vous faites l'hypothèse invalide que chaque jour est de 86 400 secondes de long.

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.


0 commentaires