重击:显示日期显示秒数

时间:2019-02-21 08:29:22

标签: bash date

使用date可以生成类似格式的时间字符串

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

使用date,还可以在十亿分之一秒内创建unix时间戳。使用

NANO_TIMESTAMP=$(date +%s%N)

是否可以使用date读取纳秒级的时间戳以创建格式化的日期字符串?

如何将纳秒级的时间戳传递给date

我尝试过:

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

3 个答案:

答案 0 :(得分:2)

您可以先将EPOCH中的纳秒值转换为EPOCH中的秒值,然后将其用于转换为人类可读的字符串,以实现此目的

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

要获得更精确的表示,请以纳秒为单位取模

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

因此将它们放到包装函数中

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"        
}

并命名为

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

答案 1 :(得分:1)

是的,但是您必须自己进行数学运算(除法和取模)。

> 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

答案 2 :(得分:1)

Like this,但没有数学。

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")

对于printf "%1d",我想确保secs变量中至少有一个零。