私は秒単位の時間間隔を渡していますts
。
ts=13
printf -v hours '%(%H)T' "$ts"
printf '%s\n' "ts: $ts ; hours: $hours"
これは誤った結果です。
時間:13時間:12
ご覧のとおり、13秒かかり12
ません。00
ベストアンサー1
コメントで議論したように、あなたの問題は時間帯だと思います。%(...)T
時間を現地時間で印刷します。たとえば、次のようになります。
$ printf "%(%F %T %z)T\n" "$(date +%s)"
2021-08-21 19:58:45 +0300
TZ
ただし、タイムゾーンを変更するには変数を設定できる必要があります。
$ TZ=UTC printf "%(%F %T %z)T\n" "$(date +%s)"
2021-08-21 16:59:45 +0000
特に、パラメータはエポック以降の秒数、つまり1970年1月1日00:00:00 UTCです。これは間隔ではなく特定の時点です。ただし、少し目を細くしてUTCを使用する必要があり(時間帯は重要ではありません)、年を無視すると十分に小さい値の間隔の長さとして扱うことができます。
指定子は001から366までの日付を提供するため、これを使用すると、日、時間、分、秒を最大1年まで取得できますstrftime()
。日数には1のオフセットがあります。%j
%H %M %S
$ TZ=UTC printf "%(%j %H %M %S)T\n" "$(( 123*86400 + 7*3600 + 6*60 + 5))"
124 07 06 05
または、いくつかの評価トリックを使用して値を変数に割り当てます。
$ eval "$(TZ=UTC printf "%(daysplus1=%j hours=%H mins=%M secs=%S)T" \
"$(( 123*86400 + 7*3600 + 6*60 + 5))" )"
$ days=$((daysplus1 - 1))
$ echo $days $hours $mins $secs
123 07 06 05
もちろん、days=$((ts / 86400))
日数しか使えず、1年の価値に制限はありません。
または手動で計算してみてください。
secs=$(( ts % 60));
mins=$(( ts / 60 % 60 ));
hours=$(( ts / 3600 % 24));
days=$(( ts / 86400 ));
(このeval
ヒントは一部から得られたものです。スティーブン答えはしたが、どれか覚えていません。 )