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 ci‑aprè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.
Post a Comment