シェル:バッシュ。
目標:printfを使用して、タイムスタンプ処理に適した固定時点以降の時間t(ミリ秒)を取得します。
条件:解決策は完全な行テキストテストに合格する必要があります。
さらに、解決策は原子性(はい、そうです!..)でなければならず、軽くなければならず、量子化と丸めの問題を最小限に抑える必要があります。
t=$[$(date +%s%N)/1000000]
<---私のソリューション、この場合の固定点は1970年1月1日です。だがダブルデートコールのため根本的に悪い状況になった。
printf "t=%d\n" $[$(date +%s%N)/1000000]
<--- まさにprintfを使うことです。
t=$(date +%s)$[10#$(date +%N)/1000000]
<---ひどい例です。前のゼロを削除してから再入力する必要があるようです。
printf "t=%d%03d\n" $(date +%s) $[10#$(date +%N)/1000000]
<--- まさにprintfを使うことです。
より良い(賢い)アドバイスはありますか?
編集(追加):
t=$(date +%s%N)
それではprintf "%s\n" ${t::13}
<---私の考えには一行でもないようだが。
ベストアンサー1
bash5+から始まる簡単な解決策があります。
$ printf "%.3f\n" $EPOCHREALTIME
1566917328.786
この点が必要ない場合:
printf "%s\n" "$((${EPOCHREALTIME/.}/1000))"
1行のテキスト、アトミック(内部bash変数への1回の呼び出し)、軽量で量子化または丸めの問題のないエポック以降の時間をミリ秒単位で提供します。