Unix 纪元(以毫秒为单位)

Unix 纪元(以毫秒为单位)

我将具有“纳秒”精度的 Unix 纪元添加到命令的输出中,如下所示:

$ command | while read line; do d=`date +%s%N`; echo $d $line; done > file

我四处寻找如何将“纳秒”变成“毫秒”。例如,我遵循给出的解决方案这里。因此,我尝试了两种建议的方法:

$ command | while read line; do d=`echo $(($(date +%s%N)/1000000))`; echo $d $line; done > file
$ command | while read line; do d=`date +%s%N | cut -b1-13`; echo $d $line; done > file

然而,在这两种情况下,当我将文件插入 InfluxDB 并查询数据库时,我得到以下信息:

time    
1970-01-01T00:24:05.419982325Z  
1970-01-01T00:24:05.419982344Z  
1970-01-01T00:24:05.419982371Z  
1970-01-01T00:24:05.419982378Z  
1970-01-01T00:24:05.419982388Z  
1970-01-01T00:24:05.419982401Z

更新

当我使用具有纳秒精度的 epoch 时date +%s%N,我得到以下结果:

time
2015-10-21T08:59:59.978902683Z  
2015-10-21T08:59:59.982615836Z  
2015-10-21T08:59:59.983958069Z  
2015-10-21T08:59:59.98805317Z   
2015-10-21T08:59:59.99717678Z   
2015-10-21T09:00:00.028624495Z  

我期待这样的输出:

2015-10-21T09:12:10.001327Z

如果您有任何解决方案,请告诉我。

答案1

您可以使用bcprintf

printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")"

这给出了自 1970 年 1 月以来的毫秒数。我没有故意使用选项scale=nbc因为这不会对值进行四舍五入,而是截掉其余部分(我知道,这是迂腐的)。 bc 从文件或标准输入读取。<<<是一个这里的字符串它扩展了内容并将它们作为标准输入提供给bc.这是为了printf对值进行四舍五入。


以此为例:

$ d=$(date "+%s.%N")
$ echo $d; bc <<<"scale=0; ($d*1000)/1"; printf "%0.f" "$(bc <<<"$d*1000")"
1445423229.512731661 # plain date
1445423229512 # bc with scale
1445423229513 # bc/printf

在循环中它看起来像这样:

command | while read line; do
  d=$(printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")")
  echo "$d $line"
done >file

答案2

纳米为10 -9,毫为10 -3。因此,我们可以使用纳秒的前 3 个字符来获取毫秒:

date +%s%3N

man date

%N 纳秒 (000000000..999999999)

%s 自 1970-01-01 00:00:00 UTC 以来的秒数

来源:服务器故障如何使用 bash 获取当前 Unix 时间(以毫秒为单位)?。注意我在 Stack Overflow 的同等问题中发布了相同的答案Linux命令获取以毫秒为单位的时间

答案3

你几乎猜对了,只是多了几个回勾

$ d=$(($(date +%s%N)/1000000))
$ echo $d
1445422618527
$ d=$(date +%s%N)
$ echo $d $(( d / 10 )) $(( d / 1000000 ))
1445422673712321597 144542267371232159 1445422673712

相关内容