Ceci est une ancienne révision du document !
Table des matières
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
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)
