Utilisation de la commande date

Source : http://www.jacksay.com/tutoriaux/bash-shell/bashshell-utilisation-commande-date.html

Pense-bête pour l'utilisation de la commande date en bash / shell.

Petit pense-bête pour les manipulations de date en Bash/shell.

Base

Il vaut mieux utiliser la notation YYYY-MM-DD à la place de MM/DD/YY qui est équivoque.

Retourne la date du jour avec les règles de localisation de la machine, par exemple pour une bécane Franco-française :

date

retourne mardi 17 novembre 2009, 06:55:32 (UTC+0100)

Epoch Timestamp - Temps UNIX - Heure UNIX - POSIX timestamp

Voir

https://fr.wikipedia.org/wiki/Heure_Unix

https://fr.wikipedia.org/wiki/Epoch

Timestamp Epoch maintenant

date +%s

Convertir un timestamp Epoch dans un format lisible

date -d @1447070995

Le timestamp d'une date précise :

date -d "2011-08-31 23:39:36" +%s

Changer manuellement l'heure du système

Heure locale

date -s "2015-06-06 12:12"

Heure UTC universelle

date -u -s "2015-06-06 10:12"

Et set the Hardware Clock to the current System Time

#hwclock --systohc hwclock -w

Heure d'un autre fuseau horaire

# Sous Debian, le fichier suivant doit exister : #ls /usr/share/zoneinfo/Africa/Djibouti env TZ=Africa/Djibouti date env TZ=':Africa/Djibouti' date

l'option -d

Ensuite y'a la paramètre -d assez “marrant” qui permet ce genre de chose

date -d 'now'
# retourne mardi 17 novembre 2009, 06:57:53 (UTC+0100)
date -d 'yesterday'
# retourne lundi 16 novembre 2009, 06:58:32 (UTC+0100)
date -d "tomorrow"
# retourne mercredi 18 novembre 2009, 06:58:55 (UTC+0100)
date -d "days"
# retourne mardi 18 novembre 2009, 06:59:15 (UTC+0100)
date -d "week"
# retourne mardi 24 novembre 2009, 06:59:30 (UTC+0100)
date -d "month"
# retourne jeudi 17 décembre 2009, 06:59:59 (UTC+0100)
date -d "year"
# retourn mercredi 17 novembre 2010, 07:03:08 (UTC+0100)

Ensuite on peut utiliser des précisions pour le nombre de jour/semaine/mois/année

date -d "3 days"
# retourne date 'now' + 3 jours
date -d "2 week"
# Retourne la date dans 2 semaines

Bon etc, ça marche pour jour, semaine, mois année, ensuite on peut ajouter le mot ago pour afficher la date passé.

date -d "1 month ago"
# retourne la date il y a un mois

Pareil, ça marche pour les jours, semaines, mois et années

Ajouter un nombre de jours à une date précise

date -d "2024-01-16 34 days ago"
# Wed Dec 13 00:00:00 CET 2023

Redémarrer un serveur à une date précise

shutdown -r -f $(( ($(date -d "2024-01-13" "+%s") - $(date -d "now" "+%s"))/60 ))

Mettre en forme la date

Format ISO prédéfini

$ date --iso-8601=second
2020-03-05T14:49:58+02:00

Enfin (je vais terminer la dessus), on peut mettre en forme la date un peu à la manière de date() en php

date "+%Y-%m-%d"
# retourn ANNEE-MOIS-JOUR

Notez que la chaine de caractère (pattern de format) doit être rédigé de façon assez précise, elle commence par un '+' et les caractères de substitutions sont toujours précédés d'un '%'.

Pour obtenir par exemple en timestamp au format mysql ça donne

date "+%Y-%m-%d %H:%M:%S"

Voici un petit tour rapide des patterns supportés (les principaux)

Année

%Y : Année sur 4 chiffres

%C : Le siècle (en gros les 2 premiers chiffres de l'année, si elle a 4 chiffres…)

Mois

%b : Nom du mois sur 3 lettres

%B : Nom du mois

%m : Numéro du mois sur 2 chiffres

Semaine (numéro)

%V : Numéro de la semaine

Jours

%a : Nom du jour de la semaine sur 3 lettres

%A : Nom du jour de la semaine

%d : Numéro du jour dans le mois sur 2 chiffres

%j : Numéro du jour dans l' année

Heures

%H : Heures sur 24 heures

%I : Heures sur 12 heures

Minutes

%M : Minutes sur 2 chiffres

Secondes

%S : Secondes sur 2 chiffres

Raccourcis

%F : YYYY-MM-DD

%T : HH-MM-SS

Voilà pour les principaux <lang en>patterns</lang>

Sachez enfin qu'un cumule de -d “durée” et de “+%PATTERN” est possible et cela s'avère parfois assez pratique :

date -d "2 week" "+%F %T"
# Retourne un timestamp MySQL du jour qu'il sera dans 2 semaines

Pour plus de détails : man date

Exemple numéro de la semaine

Numéro de la semaine courante

date "+%V"

Numéro de la semaine à une date précise

LANG=C date --date="2016-08-16" +"%V"

bash calculate time elapsed between two date timestamps

Source : https://gist.github.com/tuxfight3r/1c11479813bc5ec48fd2e5e648c43384

#!/bin/bash date1="2023-02-08 10:50:33" date2="2023-02-08 14:10:33" date1_seconds=$(date -d "$date1" +"%s") date2_seconds=$(date -d "$date2" +"%s") duration=$(( $date2_seconds - $date1_seconds )) echo "Time Elapsed: $(($duration/3600)) hours $(($duration %3600 / 60)) minutes and $(($duration % 60)) seconds."

Autres

date --rfc-2822
Tue, 15 Sep 2015 14:48:21 +0200
date --rfc-3339=date
2023-03-31
env TZ=Europe/Paris date --rfc-3339=second -d '2023-08-23 21:50'
2023-08-23 21:50:00+02:00

date --rfc-email

Python

#! /usr/bin/env python3 import os import subprocess my_env = {**os.environ, 'TZ': 'Europe/Paris'} with open(filename, mode="w") as f: subprocess.run(["date"], shell=False, check=True, stdout=f, env=my_env)