3
votes

Bash: afficher les nanosecondes avec la date

Avec date , il est possible de générer des chaînes d'heure formatées comme

date -d$NANO_TIMESTAMP +%H:%M:%S.%N     
date: invalid date ‘1550736813798767689’

date -d@$NANO_TIMESTAMP +"%Y-%m-%d-%H:%M:%S.%N"
date: time 1550736813798767689 is out of range

Avec date , il est également possible de créer des horodatages unix dans nano secondes. Utilisation de

NANO_TIMESTAMP=$(date +%s%N)

Est-il possible d'utiliser date pour lire dans un horodatage nano seconde pour créer une chaîne de date formatée?

Comment puis-je transmettre un horodatage nano seconde à date?

J'ai essayé:

date +"%Y-%m-%d-%H:%M:%S.%N"


0 commentaires

3 Réponses :


2
votes

Vous pouvez le faire en convertissant d'abord la valeur nanoseconde dans EPOCH en valeur en secondes dans EPOCH, puis l'utiliser pour la conversion en chaînes lisibles par l'homme

from_nano_to_readable 1550736813798767690
2019-02-21-03:13:33.798767690

Pour une représentation encore plus précise, prenez le modulo de la nano deuxième valeur

from_nano_to_readable() {
    (( $# )) || { printf '%s\n' 'provide atleast one argument' >&2 ; }
    input="$1"
    withNano="$(( $input % 1000000000 ))"
    withoutNano="$(date -d@"$(( $input / 1000000000 ))" +"%Y-%m-%d-%H:%M:%S")"
    printf '%s\n' "$withoutNano.$withNano"        
}

Donc, mettre cela ensemble dans une fonction wrapper

withNano="$(( $nano % 1000000000 ))"
withoutNano="$(date -d@"$(( $nano / 1000000000 ))" +"%Y-%m-%d-%H:%M:%S")"
echo "$withoutNano.$withNano"

et l'appeler

nano=1550736813798767689
date -d@"$(( $nano / 1000000000 ))" +"%Y-%m-%d-%H:%M:%S.%N"


0 commentaires

2
votes

Oui, mais vous devez faire les calculs (division et modulo) vous-même.

> set -x

> NANO_TIMESTAMP=$(date +%s%N)
++ date +%s%N
+ NANO_TIMESTAMP=1550740150623261543

> date -d@$((NANO_TIMESTAMP/(1000*1000*1000))).$((NANO_TIMESTAMP%(1000*1000*1000))) +%Y-%m-%d-%H:%M:%S.%N
+ date -d@1550740150.623261543 +%Y-%m-%d-%H:%M:%S.%N
2019-02-21-10:09:10.623261543


0 commentaires

1
votes

Comme ça mais sans mathématiques.

NANO_TIMESTAMP=$(date +%s%N)
secs=$(printf "%1d\n" ${NANO_TIMESTAMP: 0 : -9})
nanos=${NANO_TIMESTAMP: -9 : 9 }
printf '\r%s' $(TZ=UTC date -d@$secs.$nanos +"%Y-%m-%d-%H:%M:%S.%N")

Avec printf " % 1d " Je veux m'assurer qu'il y a au moins un zéro dans la variable secs .


0 commentaires