Conversion des « timestamps » (dates format UNIX) en BASH

Comment convertir les « timestamps » UNIX en date compréhensible par un humain sous BASH ?

Le « timestamp » correspond au temps écoulé depuis le premier Janvier 1970 00h00 UTC/GMT c’est à dire minuit de l’heure universel (UTC : Coordinated Universal Time ou temps universel coordonné ayant remplacé en 1972 le GMT pour Greenwich Mean Time ou temps moyen de Greenwich (Angleterre). GMT était le temps solaire moyen sur le méridien de Greenwich tandis que l’UTC est le temps standard atomique).

Cette notation du temps, indépendante du fuseau horaire, est très pratique pour des comparaisons de dates par exemple mais s’avère peut explicite pour l’utilisateur. Ainsi, que « 1270893377 » corresponde au Samedi 10 Avril 2010 à 11h 56min et 17sec heure de Paris ne saute pas forcément aux yeux du premier venu… Heureusement, la commande « date » de BASH permet, entre autre, de rendre lisible l’illisible…

Rappels sur la commande « date »

Sous bash, la commande « date » permet d’effectuer les opérations sur les dates. Sans argument, elle retourne simplement la date courante :

fhh@mafalda ~ $ date
sam. avril 10 11:56:10 CEST 2010

Il est possible de formater le résultat obtenu. Par exemple, pour afficher la date au format « temps UNIX » nous saisirons :

fhh@mafalda ~ $ date +'%s'
1270893377

A titre de rappel, la commande « date » permet d’initialiser la date du système (pour les système n’utilisant pas ntp) en lui passant en argument la date au format « MMDDHHMMYYYY » soit le mois, le jour, l’heure et les minutes sur 2 digits, et l’année sur 4 :

root@mafalda:~# date
Sat Apr 10 10:12:40 EDT 2010
root@mafalda:~# date 041011142010
Sat Apr 10 11:14:00 EDT 2010

« date » S’appuie sur le fichier de configuration « /etc/localtime » ou « localtime » est un fichier disponible sur la plupart des distributions dans « /usr/share/zoneinfo/ » :

root@mafalda:~# ls -l /etc/localtime 
lrwxrwxrwx 1 root root 32 2010-04-10 17:17 /etc/localtime -> /usr/share/zoneinfo/Europe/Paris
Conversions de dates

« date » Permettra d’effectuer la conversion d’un timestamp en chaîne de caractères interprétable plus facilement :

fhh@mafalda ~ $ date -d @1270893377
sam. avril 10 11:56:17 CEST 2010

(« -d » ou « –date= » précise de retourner la date passée en argument et non la date standard).

Comme pour la date courante, il est possible de spécifier le formatage du résultat :

fhh@mafalda ~ $ date -d @1270893377 +'%d/%m/%Y (%A) at %X (UTC %:z)'
10/04/2010 (samedi) at 11:56:17 (UTC +02:00)

qui donne en temps universel (option « -u ») :

fhh@mafalda ~ $ date -ud @1270893377 +'%d/%m/%Y (%A) at %X (UTC %:z)'
10/04/2010 (samedi) at 09:56:17 (UTC +00:00)

Bien sur, ce qui fonctionne dans un sens fonctionne dans l’autre, ainsi pour convertir cette date « 10/04/2010 (samedi) at 09:56:17 (UTC +00:00) » en notation unix, nous écrirons :

fhh@mafalda ~ $ date -ud "apr 10, 2010 09:56:17" +'%s'
1270893377

ou, en utilisant la timezone de la machine :

fhh@mafalda ~ $ date -d "apr 10, 2010 11:56:17" +'%s'
1270893377
Pratique

La ligne BASH de conversion des timestamp étant « longue » à saisir, n’hésitez pas à ajouter à votre « .bashrc » ou à votre « .bash_profile » une fonction du type :

cquand() {
	[ ! -z ${1} ] && \
 date -d @${1} +'%d/%m/%Y (%A) at %X (UTC %:z)' || \
 date +'%d/%m/%Y (%A) at %X (UTC %:z)'
}

qui donnera à l’exécution :

fhh@mafalda ~ $ source .bashrc 
fhh@mafalda ~ $ cquand
10/04/2010 (samedi) at 13:41:09 (UTC +02:00)
fhh@mafalda ~ $ cquand 1270893377
10/04/2010 (samedi) at 11:56:17 (UTC +02:00)
Références

Man de « date » : http://linux.die.net/man/1/date
Epoch Converter – Unix Timestamp Converter : http://www.epochconverter.com/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *