36

シェルスクリプトの秒である $i の変数があり、それを 24 HOUR HH:MM:SS に変換しようとしています。これはシェルで可能ですか?

4

7 に答える 7

87

これがあなたが探していることを正確に行うための楽しいハッキーな方法です=)

date -u -d @${i} +"%T"

説明:

  • このdateユーティリティを使用すると、1970-01-01 00:00:00 UTCからの秒単位で文字列から時刻を指定し、指定した形式で出力できます。
  • オプションはUTC時刻を表示する-uことであるため、タイムゾーンオフセットは考慮されません(1970年からの開始時刻はUTCであるため)
  • 次の部分はGNUdate固有(Linux)です。
    • -dパーツは、使用する代わりに文字列から時間情報を受け入れるように指示しdateますnow
    • その@${i}部分は、それが数秒dateであるとあなたが言う方法です$i
  • これ+"%T"は、出力をフォーマットするためのものです。ページからman date%T time; same as %H:%M:%S。パーツだけを気にするのでHH:MM:SS、これがぴったりです!
于 2012-11-16T19:17:51.123 に答える
18

別のアプローチ: 算術

i=6789
((sec=i%60, i/=60, min=i%60, hrs=i/60))
timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec)
echo $timestamp

生産する1:53:09

于 2012-11-16T23:16:08.967 に答える
15

引数は-d日付からcoreutils(Linux) のみに適用されます。

BSD/OS X では、

date -u -r $i +%T
于 2014-02-17T06:48:21.073 に答える
1

エポックから秒単位の日付を表す場合$iは、次のように表示できます。

  date -u -d @$i +%H:%M:%S

しかし、あなたはそれ$iが日付ではなく間隔(例えば、ある期間)であると思っているようです、そしてそれから私はあなたが何を望んでいるのか理解していません。

于 2012-11-16T19:17:47.090 に答える
0

明確にするために、@ Darenの回答を続けます。タイムゾーンへの変換を使用する場合は、「u」スイッチを使用しないでください。date -d @$i +%Tdate -d @"$i" +%T

于 2018-02-13T15:02:25.187 に答える