{{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 :
date
retourne mardi 17 novembre 2009, 06:55:32 (UTC+0100)
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
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 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
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)