2010-01-08 Calcul d'un intervalle de dates

Différence entre les versions 14 et version actuelle

Résumé : Comment calculer en ligne de commande la durée entre deux dates.

Pas de diff disponible.

Comment calculer en ligne de commande la durée entre deux dates.

Pour tester la consommation de mon vieux dinosaure de frigo, j'ai effectué une mesure sur plusieurs jours avec le petit appareil adhoc[1]. Malheureusement, le moteur d'un frigo ne fonctionne que par intermittence, et ce genre d'appareil ne totalise la durée que pour le temps correspondant à une demande de courant. Pour connaître la consommation sur la durée d'utilisation effective du frigo - en tenant compte des moments où le moteur est au repos - il fallait donc noter la date de début et de fin de cette mesure et procéder à quelques petits calculs.

Ce genre de calcul se fait facilement sur une base estimée en secondes.

Avec le shell

La commande date permet d'afficher une date en secondes depuis « 00:00:00 1970-01-01 UTC » (c'est dans la page de man), la fameuse epoch.

Elle permet aussi d'afficher une autre date que la date courante gràce à l'option --date="xxx".

On peut donc faire le calcul en sauvegardant le début et la fin de l'intervalle dans des variables:

 $ FIN=`date +%s --date="05 Jan 2010 21:30"`
 $ echo $FIN
 1262723400
 $ DEBUT=`date +%s --date="23 Dec 2009 10:38"`
 $ echo $DEBUT
 1261561080
 $ echo $(($FIN - $DEBUT))
 1162320

1.162.320/(60*60*24) est égal à 13,452 soit environ 13 jours et demi, ça semble correct.

Pour exprimer cette durée de façon plus conviviale, c'est plus compliqué. J'ai trouvé une proposition en Perl dans le Perl Cookbook, chap. 3.5. Difference of Two Dates qui donne ceci transposée dans le shell:

  $ INTERVALLE=$(($INTERVALLE / 60))    # intervalle exprimé en minutes
  $ echo $INTERVALLE
  19372
  $ minutes=$(($INTERVALLE % 60))       # le reste d'une division par 60
  $ echo $minutes
  52
  $ INTERVALLE=$(( ($INTERVALLE - $minutes)/60 )) # on retire le surplus et on
                                                  # divise par 60 pour avoir
                                                  # l'intervalle en heures 
  $ echo $INTERVALLE
  322
  $ heures=$(($INTERVALLE % 24))        # idem pour les heures
  $ echo $heures
  10                                    # le reste
  $ INTERVALLE=$(( ($INTERVALLE - $heures)/24 ))  # intervalle expr. en jours 
  $ echo $INTERVALLE
  13
  $ echo "$INTERVALLE jours, $heures heures et $minutes minutes."
  13 jours, 10 heures et 52 minutes.

Avec Perl

  $ perl -e "use Time::Local; 
  > print timelocal(0,30,21,5,0,2010) - timelocal(0,38,10,23,11,2009)"
  1162320

Ça confirme le résultat précédent.

Toujours d'après le Perl Cookbook, chap.3.2. Converting DMYHMS to Epoch Seconds:

  $ perl -e 'use Date::Calc qw(Delta_DHMS);
  > ($days, $hours, $minutes, $seconds) =
  > Delta_DHMS( 2009, 12, 23, 10, 38, 0,
  > 2010, 01, 05, 21, 30, 0);
  > print "$days jours, $hours heures et $minutes minutes\n";'
  13 jours, 10 heures et 52 minutes

J'ai aussi trouvé par hasard un calculateur en ligne.

Pour en revenir à mon vieux frigo,

[[image:Frigo_Bosch?]]

le moteur a fonctionné 188.936 secondes durant cette période:

 188.936/1.162.320 = 0,162550

soit 16% du temps.

Pour la consommation, comme il y a 86.400 sec. dans 24h

 5,67KWh x 86.400
 --------------- = 0,4214 KWh/jour
    1.162.320

ou vu autrement

 5,67KWh x 86.400 x 365
 ---------------------- = 153,8381 KWh/an
       1.162.320

Ce qui représente un coût annuel d'environ 28€. Il faudra que j'investigue pour comparer, parce que par rapport à des chiffres glanés ça et là, je suis perplexe.