Unix 纪元(以毫秒为单位)

enc*_*ush 5 bash shell-script date timestamps time

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

$ command | while read line; do d=`date +%s%N`; echo $d $line; done > file
Run Code Online (Sandbox Code Playgroud)

我环顾四周,想知道如何将“纳秒”变成“毫秒”。例如,我遵循了此处给出的解决方案。所以,我尝试了两种建议的方法:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,在这两种情况下,当我将文件插入 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
Run Code Online (Sandbox Code Playgroud)

更新

当我以纳秒精度使用 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  
Run Code Online (Sandbox Code Playgroud)

我期待这样的输出:

2015-10-21T09:12:10.001327Z
Run Code Online (Sandbox Code Playgroud)

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

cha*_*aos 6

你可以使用bcprintf

printf "%0.f" "$(bc <<<"$(date +"%s.%N")*1000")"
Run Code Online (Sandbox Code Playgroud)

这给出了自 1970 年 1 月以来的毫秒数。我没有故意使用scale=n选项bc,因为这不会舍入该值,而是将其余部分删掉(我知道,这很迂腐)。bc 从文件或标准输入中读取。<<<是一个here 字符串,它扩展内容并将它们作为标准输入提供给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
Run Code Online (Sandbox Code Playgroud)

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

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