シェルの小数秒単位で書式設定と表示間隔

シェルの小数秒単位で書式設定と表示間隔

人間が読める形式(H:MM:SS.SSS)で表示したい時間間隔(小数点を含む秒単位)があります。たとえば、16633.284 は 4:37:13.284 と表示する必要があります。この時間はすべて24時間以内ですが、超過すれば数時間しか過ぎません。

以下はいくつかの追加例です。

   0      → 0:00:00.000
  60.394  → 0:01:00.394
8944.77   → 2:29:04.770

10時間固定幅であることに注意してください。もちろん、これを使用して簡単に実行できますprintf

私は解決策を答えとして投稿していますが、これを行うより良い方法があると思うので質問します。他の方法はありますか?私はbashisms、zshismsなどについて開いています。

注:これは以下に関連しています。秒を日/時/分/秒で表示しますか?しかし、bashの算術は整数でのみ行われるため、これらの方法のいずれも機能しません。

ベストアンサー1

小数部は時間、分、秒数に影響を与えないため、単に別々に保管しないで計算を実行してから最後に追加するだけです。このような:

#!/bin/sh
seconds=16633.284
f=${seconds##*.}
if [ "$f" = "$seconds" ]; then f=0; fi
t=${seconds%.*}
s=$((t%60))
m=$((t/60%60))
h=$((t/60/60))
printf '%d:%02d:%06.3f\n' $h $m $s.$f

出力:

   0     → 0:00:00.000
  33.    → 0:00:33.000
    .21  → 0:00:00.210
  60.394 → 0:01:00.394
8944.77  → 2:29:04.770

これはshに似たすべてのシェルで動作します(一部の古代POSIX以前のシェルを除く)。

おすすめ記事