Une compilation de documentations   { en , fr }

La commande GNU date

Étiquette:
Créé en:
Dernière modification:
Auteur:
Xavier Béguin
Version en anglais : The GNU date command

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