%(%H)Tが12時間を提供する問題を修正

%(%H)Tが12時間を提供する問題を修正

私は秒単位の時間間隔を渡しています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ヒントは一部から得られたものです。スティーブン答えはしたが、どれか覚えていません。 )

おすすめ記事