vendredi 12 février 2010

diffdate

Dates passées et futures.

La commande date affiche la date du jour:

$ date

sam. févr.  6 10:28:38 CET 2010

On peut agir sur le format de l'output via des options:

$ date "+%A %d %B %Y"

samedi 06 février 2010

Cette commande permet également de fournir une réponse à des questions du genre:

Quelle date serons nous dans 25 jours?

[michel@rigel ~]$ date "+%A %d %B %Y" -d "25 days"

mercredi 03 mars 2010

Quelle était la date il y a 25 jours?

$ date "+%A %d %B %Y" -d "-25 days"

mardi 12 janvier 2010

Quelle était la date 25 jours après le 3 décembre 2009?

$ date "+%A %d %B %Y" -d "20091203 25 days"

lundi 28 décembre 2009

On n'a pas d'emprise sur le format de la date fournie en input.

Différents formats sont automatiquement reconnus, par exemple pour le 3 décembre 2009, on aurait pu mettre au lieu de 20091203:

091203

2009/12/03

2009-12-03

12/03/2009

....

mais pas 03/12/2009  qui aurait été reconnu comme le 12 mars 2009.

Pour utiliser ce dernier format, on doit transformer l'input, avec par exemple awk, comme ciaprès:

$ echo 03/12/2009 | awk -F '/' '{print $3$2$1}'

20091203

D'autre part, on sait que $(...) représente le résultat d'une commande, comme dans cet exemple:

$ echo  Nous sommes $(date +%A)

Nous sommes samedi

Dans la commande qui donne la date 25 jours après le 3 décembre 2009, remplaçons 20091203 par $(la commande dont le résultat est 20091203):

$ date "+%A %d %B %Y" -d "$(echo 03/12/2009 | awk -F '/' '{print $3$2$1}') 25 days"

lundi 28 décembre 2009

Définissons la fonction addjours:

$ addjours() { date "+%A %d %B %Y" -d "$(echo $2 | awk -F '/' '{print $3$2$1}') $1 days" ;}

(En rouge, $1 et $2, les paramètres transmis à la fonction, remplacent 25 et 20091203; ne pas les confondre avec les arguments de l'action print de awk qui correspondent aux 3 champs de la date fournie en input)

Vérifions que la fonction est opérationnelle:

$ addjours -60 29/01/2010

lundi 30 novembre 2009

Et voilà le travail!

Il nous est loisible de ne pas fournir une date. La date prise en compte est alors la date du jour:

addjours 45

mardi 23 mars 2010

Pour garder de manière permanente la définition de cette fonction, il suffit de la mettre dans son  ~/.bashrc

Nombre de jours entre deux dates

L'option +%s permet d'afficher un date sous forme du nombre de secondes écoulées depuis le 1ier janvier 1970:

$ date +%s -d "2010/02/01"

1264978800

$ date +%s -d "2009/12/03"

1259794800

On sait que $((...)) représente le résultat d'une opération arithmétique, comme ici:

$ echo $((1264978800 - 1259794800))

5184000

5184000 est le nombre de secondes entres les deux dates.

Pour avoir le nombre de jours, il faut encore diviser par 86400:

$ echo $(((1264978800 - 1259794800)/86400))

60

Soit en remplaçant 1264978800 et1259794800 par $(la commande qui fournit ces nombres):

$ echo $((($(date +%s -d "2010/02/01") - $(date +%s -d "2009/12/03"))/86400))

60

Définissons la fonction diffdate:

$ diffdate() { echo $((($(date +%s -d $1) - $(date +%s -d $2))/86400)) ;}

($1 et $2 sont les paramètres correspondant aux dates à transmettre à la fonction)

Vérifions en l'usage;

$ diffdate 2010/02/01 2009/11/25

68

Pour utilisation du format de date habituel, il nous est loisible de passer comme précédemment  par l'intermédiaire de awk, et donc d'utiliser une fonction diffdate définie comme suit:

$ diffdate() { echo $((($(date +%s -d "$(echo  $1 | awk -F '/' '{print $3$2$1}')") - $(date +%s -d "$(echo  $2 | awk -F '/' '{print $3$2$1}')"))/86400)) ;}

Vérifions que tout est OK:

$ diffdate 03/02/2010 03/12/2009

62

Pour que la définition de diffdate soit permanente il suffit de l'ajouter à son fichier ~/.bashrc.