時間差をミリ秒単位で計算します。

時間差をミリ秒単位で計算します。

入出力エラー:

14:00:11,320      14:00:11,453 
**Correct Output** :  Time difference is 133 milli seconds.

14:00:13,097       14:00:13,124 
**Output in Error** :  line 4: 124000000 - 097000000: value too great for base (error token is "097000000")  

14:00:11:693      14:00:13:048 
**Output in Error** :  line 4: 048000000: value too great for base (error token is "048000000")

使用されたスクリプト:

g=$(( $(date -d $b +%s) - $(date -d $a +%s) ))
h=$(( $(date -d $b +%N) - $(date -d $a +%N) ))
k=$(( (g * 1000) + (h / 1000000) ))
printf "Total time difference: %i milli seconds\n"  $k

答え1

0あなたは正しいです。この数学はbashと他のほとんどのシェルで失敗します。なぜなら、数字は次に始まるCルールに従うからです。8進数、10進数ではありません:

$ echo "$((124000000 - 097000000))"
bash: 124000000 - 097000000: value too great for base (error token is "097000000")

1つの解決策は、bashする数値をデフォルトの10として正しく識別することです。

$ echo "$((10#124000000 - 10#097000000))"
27000000

問題は、10#接頭辞がない場合、bashはゼロで始まる数字を8進数と仮定することです。

または以下を使用してくださいbc

$ echo "124000000 - 097000000" | bc -l
27000000

またはawkを使用してください:

$ echo "124000000 097000000" | awk '{print $1-$2}'
27000000

数学とprintfを組み合わせる:

$ g=124000000
$ h=097000000
$ printf "Total time difference: %i milli seconds\n" "$(echo "$g - $h" | bc -l )"
Total time difference: 27000000 milli seconds

または、

$ g=124000000
$ h=097000000
$ echo "$g $h" | awk '{printf "Total time difference: %i milliseconds\n",$1-$2}'; )
Total time difference: 27000000 milli seconds

文書

からman bash

0で始まる定数は8進数として解釈されます。前に0xまたは0Xがある場合は、16進数を表します。それ以外の場合、数値は [base#]n 形式を取ります。ここで、オプションの下は算術の下を表す2〜64の10進数で、nはその下の数字です。

数学と日付の組み合わせ

$ echo "$(( $(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N') ))"
27000000

ナノ秒をミリ秒に変換するには:

$ echo "$(( ($(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N'))/1000000 ))"
27

$ echo "$(( ($(date -d '14:00:05.320' '+10#%s%N') - $(date -d '14:00:04.909' '+10#%s%N'))/1000000 ))"
411

関連情報