{{tag>date Temps Script Python}} # 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. ## Bases ** 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 : ~~~bash date ~~~ retourne mardi 17 novembre 2009, 06:55:32 (UTC+0100) ~~~bash date # # Si la date et/ou l’heure sont fausses, faire : # (MM = mois, DD = jour, hh =heures, mm = minutes, YY = année, ss = secondes : toutes les valeurs sont sur 2 chiffres) date MMDDhhmmYY.ss hwclock --systohc ~~~ ## 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 ~~~bash date +%s ~~~ Convertir un timestamp Epoch dans un format lisible ~~~bash date -d @1447070995 ~~~ Le timestamp d'une date précise : ~~~bash date -d "2011-08-31 23:39:36" +%s ~~~ ## Changer manuellement l'heure du système Heure locale ~~~bash date -s "2015-06-06 12:12" ~~~ Heure UTC universelle ~~~bash date -u -s "2015-06-06 10:12" ~~~ Et set the Hardware Clock to the current System Time ~~~bash #hwclock --systohc hwclock -w ~~~ ## Heure d'un autre fuseau horaire ~~~bash # 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 ~~~bash 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 patterns 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 ~~~bash date "+%V" ~~~ Numéro de la semaine à une date précise ~~~bash LANG=C date --date="2016-08-16" +"%V" ~~~ ### bash calculate time elapsed between two date timestamps Source : https://gist.github.com/tuxfight3r/1c11479813bc5ec48fd2e5e648c43384 ~~~bash #!/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 ~~~ ~~~bash date --rfc-email ~~~ ### Python ~~~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) ~~~