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"
3 Réponses :
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"
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
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
.