objectif
Générer des timestamps ISO 8601 en UTC et faire des décalages temporels de manière portable (Linux GNU et macOS/BSD).
code minimal
# maintenant en ISO 8601 UTC (Zulu)
date -u +%Y-%m-%dT%H:%M:%SZ
utilisation
# Linux (GNU): plus 15 minutes, moins 2 jours
date -u -d '+15 minutes' +%Y-%m-%dT%H:%M:%SZ
date -u -d '-2 days' +%Y-%m-%dT%H:%M:%SZ
# macOS/BSD: plus 15 minutes, moins 2 jours
date -u -v+15M +%Y-%m-%dT%H:%M:%SZ
date -u -v-2d +%Y-%m-%dT%H:%M:%SZ
# convertir epoch -> ISO 8601 UTC
# Linux:
date -u -d @1690000000 +%Y-%m-%dT%H:%M:%SZ
# macOS/BSD:
date -u -r 1690000000 +%Y-%m-%dT%H:%M:%SZ
# convertir ISO 8601 UTC -> epoch
# Linux:
date -ud '2025-08-15T12:34:56Z' +%s
# macOS/BSD:
date -ujf '%Y-%m-%dT%H:%M:%SZ' '2025-08-15T12:34:56Z' +%s
# debut et fin du jour UTC (00:00:00Z et 23:59:59Z)
# Linux:
date -u -d 'today 00:00:00' +%Y-%m-%dT%H:%M:%SZ
date -u -d 'today 23:59:59' +%Y-%m-%dT%H:%M:%SZ
# macOS/BSD:
d=$(date -u +%Y-%m-%d); printf '%sT00:00:00Z\n' "$d"; printf '%sT23:59:59Z\n' "$d"
# format RFC 3339 (Linux GNU)
date --rfc-3339=seconds | sed 's/ /T/; s/+00:00/Z/'
variante(s) utile(s)
# forcer une zone horaire cible (ex: Europe/Paris) pour affichage local
TZ="Europe/Paris" date +%Y-%m-%dT%H:%M:%S%z
# timestamp lisible pour logs
ts() { date -u +%Y-%m-%dT%H:%M:%SZ; }
echo "$(ts) job started"
# microsecondes en UTC (Linux GNU)
date -u +%Y-%m-%dT%H:%M:%S.%6NZ
# fallback portable via Python (si differences GNU/BSD posent probleme)
python3 - <<'PY'
import datetime, sys
now = datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z"
print(now)
PY
# ajouter N heures/minutes portable via Python
h=3; m=30
python3 - "$h" "$m" <<'PY'
import datetime, sys
h, m = map(int, sys.argv[1:3])
t = datetime.datetime.utcnow() + datetime.timedelta(hours=h, minutes=m)
print(t.replace(microsecond=0).isoformat() + "Z")
PY
notes
datediffere entre Linux (GNU) et macOS/BSD: utilisez-dsur Linux et-v/-r/-j -fsur macOS.- ajoutez toujours
-upour travailler en UTC; evite les surprises dues aux changements d’heure. - pour convertir ISO -> epoch sur macOS, la combinaison
-j -frequiert un format explicite. - validez vos formats en amont si un autre outil consomme ces timestamps (API, bases de donnees).