Bash

Unix 紀元(以毫秒為單位)

  • October 21, 2015

我將具有“納秒”精度的 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

更新

當我使用具有納秒精度的紀元時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

如果您有任何解決方案,請告訴我。

你可以使用bcand printf

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

這給出了自 1970 年 1 月以來的毫秒數。我沒有故意使用scale=n選項bc,因為這不會對值進行四捨五入,而是會減少其餘部分(我知道,這很迂腐)。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

引用自:https://unix.stackexchange.com/questions/237603