2001年1月1日00:00以降に経過した秒数をbashから人が読める日付に変換するにはどうすればよいですか?

2001年1月1日00:00以降に経過した秒数をbashから人が読める日付に変換するにはどうすればよいですか?

たとえば、Swiftは次のことを行います。

let date = Date(timeIntervalSinceReferenceDate: 500000)
print(date) 

取得するには:

2001-01-06 18:53:20 +0000

答え1

Unix Epoch は 2001-01-01 00:00:00 UTC ではなく 1970-01-01 00:00:00 UTC なので、使用可能なツール (gnu date コマンドなど) は 2 時間の間の秒数だけを提供する必要があります。組み込み変換機能は結果の実際のデータを提供します。

$ seconds=500000
$ TZ=UTC date --iso-8601=s -d @$(( $(date +%s -d '2001-01-01T00:00:00+00') + $seconds ))
2001-01-06T18:53:20+00:00

修正する:(コメントをくれた@Kusalanandaに感謝します。)実際にUnix Epochは言及する必要さえありません。これは、GNU dateコマンドが与えられた日付に直接時間オフセットを追加できるようにするためです。正しい単位サフィックスが必要です(ここseconds)。これにより、コマンドが簡単になり、より一般的で読みやすくなります。

$ seconds=500000
$ TZ=UTC date --iso-8601=s -d "2001-01-01T00:00:00+00 + $seconds seconds"
2001-01-06T18:53:20+00:00

OPの出力とまったく同じ出力形式を出力するには、次のよう--iso-8601=sに置き換えます。'+%F %T %z'

上記のコマンドは、次のオプションとパラメータを使用します。

  • -d:現在の日付の代わりに与えられた日付を使用します。時間オフセットの追加を含めることができます。
  • --iso-8601=sISO形式は、次のようにスペースを送受信するのと似ています。+%F %T %z説明が必要です。ここで、%z は UTC からの時間帯オフセットであり、強制によりここでは+Y-%m-%d %H:%M:%S %z+0000 になります。TZ=UTC

答え2

以下awkをサポートする実装を使用してください(例:GNUまたはGNU)。mktime()strftime()mawkawk

$ awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00"); print strftime("%F %T %z", epoch + 500000) }'
2001-01-06 18:53:20 +0000

まず、2001-01-01 00:00に対応するUNIXタイムスタンプを作成し、500000秒を追加し、フォーマットstrftime()文字列に従って結果をフォーマットして印刷します。ここでの計算は現地時間で行われます。

コマンドラインの引数から秒を取得します。

awk -v offset=500000 '
    BEGIN { epoch = mktime("2001 01 01 00 00 00")
            print strftime("%F %T %z", epoch + offset) }'

標準入力から秒(各行の最初の単語)を読みます。

awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00") }
           { print strftime("%F %T %z", epoch + $1)   }'

awkおよび機能の説明と利用可能なフォーマット文字列については、マニュアルを参照してください。mktime()strftime()man strftime

UTC計算と出力が現地時間ではなくUTCで行われるようにTZ環境変数を設定します。

TZ=UTC awk ...as above...

関連情報