date

Utilisations de la commande date sous UNIX

Dans un shell UNIX, la commande date permet de modifier, d'afficher la date ou encore d'effectuer quelques opérations.

Affichage de la date

Pour afficher la date selon un format précis, il faut utiliser la commande :

date "+format de date"

ou encore :

date '+format de date'

Avec pour format de date :

formats de date

format

affichage

description

%d

01-31

jour du mois

%m

01-12

mois

%H

00-23

heure

%I

00-12

heure

%k

0-23

heure

%l

0-12

heure

%p

AM/PM

notation locale

%r

hh:mm:ss [AP]M

heure:minutes:secondes

%s

entier

nombre de secondes écoulées depuis 01/01/1970 00:00:00
L'opération inverse s'effectue avec l'option -r

%T

hh:mm:ss

heure actuelle

%Z

ex : CET

fuseau horaire

%a

Mon-Sun

jour 3 caractères

%A

Monday-Sunday

jour complet

%b

Jan-Dec

mois 3 caractères

%B

January-December

mois complet

%c

ex : Sun Nov 10 12:15:37 CET 2007

date et heure

%D

mm/jj/aa

date

%h

Jan-Dec

mois 3 caractères

%U

00-53

numéro de la semaine (commençant le dimanche)

%W

00-53

numéro de la semaine (commençant le lundi)

%w

0-6

jour de la semaine (0:dimanche)

%j

001-366

jour de l'année

%Y

ex : 2007

année sur 4 (ssaa)

%y

ex : 07

année sur 2 (aa)

%M

00-59

minutes

%S

00-61

secondes

%x

ex : 01/12/07

date simplifiée (dd/mm/aa)

%X

ex : 15:34:56

heure simplifiée (hh24:mi:ss)

n

saut de ligne

t

tabulation

À cela, l'on peut ajouter n'importe quel caractère qui sera inséré dans le format d'affichage à l'endroit indiqué. Par exemple :

date '+%d/%m/%Y %r'
04/01/2007 07:15:34

Opération sur la date

L'option -v permet d'effectuer des opérations sur la date.

date -v+1M

ajoute une minute.

date -v+1H

ajoute une heure.

date -v+1d

ajoute un jour.

date -v+1m

ajoute un mois.

date -v-1y

enlève un an.

date -v+mon

positionne la date sur le prochain lundi (sauf si c'est le jour actuel).

date -v-1y -v+1H -v+4d

enlève un an, ajoute une heure et 4 jours.

date -v0y

sélectionne la date du jour pour l'année se finissant par 0 soit le même jour, même heure en l'an 2000.

date -v1d -v+1m -v-1d -v-fri

sélectionne la date du premier jour du mois (-v1d) suivant (-v+1m) , en otant ensuite un jour (-v-1d : nous sommes au dernier jour du mois) en sélectionnant le vendredi d'avant (-v-fri) : le dernier vendredi du mois.

etc.

Opération sur les dates

A partir de là, nous pouvons faire des opérations sur des dates.

Pour comparer deux dates dans (dans un shell), il suffit de les convertir en secondes avec l'option %s et de comparer les nombres.

De la même façon, pour savoir combien d'années, mois, jours, heures, minutes et secondes séparent deux dates, il sera plus aisée de d'abord les convertir en secondes puis de faire la différence et ensuite de diviser le résultat par le multiple nécessaire pour obtenir les minutes, les heures, les jours, etc.

Pour convertir une date en secondes, il suffit de la convertir avec l'option -f. Par exemple :

date -j -f "%d/%m/%Y" "01/02/2006" "+%s"

convertit la date 01/02/2006 entrée sous le format dd/mm/yyyy en secondes, soit 1138810335.

Exemples de calcul de comput

Lundi de Pâques

Il peut être parfois utile de calculer des jours de fêtes qui ne sont pas fixes mais définies selon des calculs précis. Voyons donc un exemple avec le lundi de Pâques.

Pour calculer le dimanche de Pâques, il faut appliquer un algorithme. Pour des raisons de performance, cet algorithme sera appliqué à l'aide de bc. L'algorithme employé est celui de Oudin (disponible sur Wikipedia) et donne les définitions suivantes (paques.bc):

/* CALCUL DE PAQUES SELON L'ALGORITHME DE OUDIN */
define g(annee) {return(annee%19)}

define c(annee) {
scale=0
return(annee/100)
}

define c4(annee) {
scale=0
return(annee/400)
}

define e(annee) {
scale=0
return((8 * c(annee) + 13) / 25)
}

/* H qui dépend de l'épacte : diviser (19xG + C - C_4 - E + 15) par 30, en prend le reste */
define h(annee) {
scale=0
return((19 * g(annee) + c(annee) - c4(annee) - e(annee) + 15)%30)
}

define k(annee) {
scale=0
return(h(annee)/28)
}

define p(annee) {
scale=0
return(29/(h(annee) + 1))
}

define q(annee) {
scale=0
return((21 - g(annee))/11)
}

/* I : nombre de jours entre la pleine lune pascale et le 21 mars : ( KxPxQ - 1 ) x K + H */
define i(annee) {
scale=0
return((k(annee) * p(annee) * q(annee) - 1) * k(annee) + h(annee)) 
}


/*B : diviser l'année par 4 et enlever les décimales, y ajouter l'année*/
define b(annee) {
scale=0
x=annee/4
return(annee + x)
}

/* J1 : Additionner B + I + 2 + C_4 et retrancher C */
define j1(annee) { return( b(annee) + i(annee) + 2 + c4(annee) - c(annee)) }

/* J2 calcule le jour de la lune pascale (0=dimanche 1=lundi...6=samedi) : diviser J1 par 7 et en prendre le reste */
define j2(annee) {return(j1(annee) % 7)}

/* le résultat final : 28 + I - J2 */
define paques(annee) {
return(28 + i(annee) - j2(annee))
}

Remarque

La fonction paques(annee) retourne le nombre de jours du mois de mars. Normalement, cette fonction donne le dimanche de Pâques. Mais la valeur 1 donnant le premier mars, une opération sur les dates nous ferait soit débuter le dernier jour du mois de février ( +1 = 1er mars) auquel cas il faudrait définir si c'est une année bissextile, soit retrancher 1. Pour le lundi de Pâques, il s'agit de dimanche de Pâques +1. L'opération s'annule et correspond, dans notre opération, au lundi de Pâques.

Le calcul du lundi de Pâques est donc effectué de la manière suivante :

nbjours=$( echo "paques(${annee})" | bc ${racine}/bc/paques.bc )
lundipaques=$(date -v+${nbjours}d  -f "%d/%m/%Y" "01/03/${annee}" +'%Y%m%d')

En utilisant en paramètre annee = l'année désirée.

Jeudi de l'Ascension

Le jeudi de l'Ascension correspond au jeudi de la semaine 40 jours après le dimanche de Pâques. Ajoutant donc à notre fichier bc la définition suivante :

define ascension(annee) {
return(paques(annee) + 40)
}

Puis effectuons le calcul sur les dates :

nbjours=$( echo "ascension(${annee}) - 1" | bc ${racine}/bc/paques.bc )
jeudiascension=$(date -v+${nbjours}d -v-mon -v+3d -f "%d/%m/%Y" "01/03/${annee}" +'%Y%m%d')

Remarque

Comme nous fixons nos calculs sur le 01 mars, il y a un décalage d'un jour par rapport à l'algorithme qui retourne le nombre de jours du mois de mars. D'où :

echo "ascension(${annee}) - 1"

date -v+${nbjours}d permet de déterminer la date Pâques + 40 jours obtenue par le comput.

-v-mon permet d'obtenir le lundi de cette semaine.

-v+3d permet d'obtenir le 3ème jour après le lundi, soit le jeudi.

Autres exemples

D'autres exemples sont disponibles :

calcul d'un calendrier maya ou d'un jour julien