Afficher la date actuelle sous un format personnalisé
Si vous utilisez la ligne de commande sous GNU/Linux, vous connaissez peut-être
déjà les nombreux formats de date et d'heure selon lesquels la commande
date
du projet GNU peut afficher ses informations. La
page de manuel
date(1)
(en
français) nous renseigne sur ces nombreux formats, qu'on désigne à l'aide de
séquences combinables du type %d
dans un argument de la commande commençant
par +
.
En voici un exemple :
$ date +"Le %A %-d %B %Y à %R (le %j ième jour de l'année)".
Le samedi 4 octobre 2014 à 18:15 (le 277 ième jour de l'année).
Pour certaines séquences (comme %A
et %B
ci-dessus), date
se base sur les
paramètres régionaux (aussi appelés « localisation », ou, en anglais,
« locale ») désignés par la variable d'environnement LC_TIME
pour afficher
des valeurs dans la langue désignée. Cette variable peut prendre comme valeur
une des localisations disponibles qu'on peut lister avec la commande locale -a
. Si la variable désigne une localisation indisponible sur le système,
date
utiilisera par défaut l'anglais.
Sur un système configuré avec une localisation particulière, on peut utiliser
ponctuellement l'utilisation d'une localisation différente en modifiant
l'environnement de la commande comme ceci : LC_TIME=C date +%B
(la
localisation C
représente les valeurs par défaut du système, donc ici
l'anglais sera utilisé).
Afficher une date précise
Une fonctionnalité beaucoup moins connue de date
en fait une commande bien
plus intéressante qu'elle pouvait en avait l'air. Elle n'est pourtant évoquée
que très discrètement dans sa page de
manuel,
on peut donc facilement passer à côté : il s'agit de l'option -d
qui permet
de préciser une date à afficher, et surtout la façon dont on peut désigner
cette date.
Afficher une date absolue
On peut préciser cette date ou cette heure de façon absolue, comme 1914-07-28 06:00
ou 28 July 1914 17:00
(seuls les noms en anglais sont reconnus) :
$ date -d '1914-07-28 06:00'
mardi 28 juillet 1914, 06:00:00 (UTC+0200)
$ date -d '28 July 1914 06:00:00'
mardi 28 juillet 1914, 06:00:00 (UTC+0200)
Afficher une date relative
Ce qui est cependant particulièrement pratique, c'est de désigner la date à afficher de façon relative à l'heure actuelle ou à une date fournie. Par exemple :
$ date -d 'yesterday'
vendredi 3 octobre 2014, 18:15:37 (UTC+0200)
$ date -d '2 days ago'
jeudi 2 octobre 2014, 18:15:42 (UTC+0200)
$ date -d 'last monday'
lundi 29 septembre 2014, 00:00:00 (UTC+0200)
$ date -d '1918-11-11 - 4 years'
mercredi 11 novembre 1914, 00:00:00 (UTC+0200)
$ date -d '2000-01-01 - 1 day'
vendredi 31 décembre 1999, 00:00:00 (UTC+0200)
Les formats d'entrée de date sont documentés dans la page info de date
:
lancez la commande info date
et suivez le lien Date input formats::
(placer
le curseur dessus et faites Entrée). Cette page donne des liens vers tous les
formats acceptés pour préciser la date à afficher; pour les informations sur
les dates relatives, suivre le lien Relative items in date strings::
depuis
cette page.
Subtilité de l'expression « last month
»
Attention toutefois à quelques subtilités dans ce mécanisme de dates
relatives : comme le précise la documentation, le terme last month
équivaut à
- 30 days
. Il faut donc prendre garde lorsqu'on l'utilise le dernier jour du
mois comme référence :
~$ date -d "2014-10-31 last month"
mercredi 1 octobre 2014, 00:00:00 (UTC+0200)
Pour obtenir le nom du mois précédent, il vaut mieux préciser un jour du mois
qui ne posera pas de problème, par exemple le 15 du mois. Pour cela, on peut
utiliser deux appels imbriqués à date
. Le premier permet de construire la
date du 15 du mois en cours, et le second le nom du mois précédent :
$ date -d "$(date "+%Y-%m-15") last month" +%B
septembre
Préciser le fuseau horaire des dates en entrée ou en sortie
Fuseau horaire de la date à afficher
En complément, notez que, comme pour de nombreuses commandes, pour obtenir
l'heure dans un autre fuseau horaire, il suffit de changer la variable
d'environnement TZ
avant d'appeler date
.
Ainsi, pour savoir quelle heure il est actuellement à Singapour, on peut utiliser la commande :
$ TZ="Asia/Singapore" date
dim. 5 octobre 2014 18:43:05 +08
Les fichiers conservant les informations de fuseaux horaires correspondant aux
villes désignées par TZ
sont conservés sous le répertoire
/usr/share/zoneinfo
(sous Debian du moins). Pour avoir une idée de tous les
fichiers de ville disponibles, on peut utiliser la commande suivante :
find /usr/share/zoneinfo -printf "%P\n"
Si on souhaite obtenir l'heure du fuseau horaire UTC-8 ou GMT-8 (il semble qu'ici GMT est utilisé en remplacement de UTC), on peut également utiliser :
$ TZ="Etc/GMT-8" date +"%A %-d %B %Y, %T %z"
dimanche 5 octobre 2014, 00:37:00 +0800
Ce n'est pas une erreur, il faut bien indiquer le fichier Etc/GMT-8
pour
obtenir le fuseau horaire GMT+8
. Il s'agit d'une notation déroutante héritée
du standard POSIX. Debian possède d'ailleurs à ce sujet le bug
#540305 (ouvert
depuis 2009…).
Fuseau horaire de la date fournie en entrée
On peut aussi avoir besoin de préciser le fuseau horaire de la date qu'on
fournit en entrée grâce à l'option -d
,
Par exemple, on va chercher à savoir quelle heure il était à Hong-Kong quand il était 18h45 le 4 octobre 2014 à Port-au-Prince (en Haïti) :
- si l'on sait que Port-au-Prince utilisait le fuseau horaire UTC-4 en octobre
2014 (comme heure d'été), on peut ajouter le fuseau
-0400
dans la date fournie en entrée :~$ TZ="Asia/Hong_Kong" date -d '2014-10-04 18:45-0400' dim. 05 oct. 2014 06:45:00 HKT
- mais si on ne sait pas quel était le fuseau horaire utilisé à Port-au-Prince
ce jour-là, on peut préciser le lieu à l'aide là aussi de la variables
TZ
dans l'argument de l'option-d
:~$ TZ="Asia/Hong_Kong" date -d 'TZ="America/Port-au-Prince" 2014-10-04 18:45' dim. 05 oct. 2014 06:45:00 HKT