Outils pour utilisateurs

Outils du site


tech:bashshell-utilisation-commande-date

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tech:bashshell-utilisation-commande-date [2025/03/24 15:06] – créée - modification externe 127.0.0.1tech:bashshell-utilisation-commande-date [2026/06/07 19:12] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +<!DOCTYPE markdown>
 +{{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 <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
 +~~~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)
 +~~~
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki