techno.firenode.net Open in urlscan Pro
185.17.178.132  Public Scan

URL: http://techno.firenode.net/article.sh?id=d2016080408105995480
Submission: On October 20 via manual from FR — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

DATE

Utilisations de la commande date sous UNIX

2016-09-23

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

Shell UNIX FreeBSD

The Internet Defense League

Design & Infrastructure : firenode.net ◆ Site géré par EntropyCMS ◆ Entièrement
développé et motorisé par des logiciels libres ◆ Licence

Contacter l'administrateur du site

Serveur fonctionnant aux énergies 100% renouvelables