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.

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

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

Mois

Semaine (numéro)

Jours

Heures

Minutes

Secondes

Raccourcis

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)