cliでエポックタイムスタンプを人間が読める形式に変換するには?

cliでエポックタイムスタンプを人間が読める形式に変換するには?

cliでエポックタイムスタンプを人間が読める形式に変換するには?日付を使用してこれを行う方法があると思いますが、構文が混乱しています(他の方法も歓迎します)。

答え1

*BSDから:

date -r 1234567890

Linux(特に GNU coreutils ≥5.3):

date -d @1234567890

以前のバージョンのGNU Dateでは、UTC時代との相対的な違いを計算できます。

date -d '1970-01-01 UTC + 1234567890 seconds'

移植性が必要な場合は幸運ではありません。 POSIXシェルコマンドを使用して(直接計算を実行せずに)行をフォーマットできる唯一の時間は、現在の時刻です。実際にPerlを使用できることが多いです。

perl -le 'print scalar localtime $ARGV[0]' 1234567890

答え2

エポック時間が秒ではなくミリ秒単位の場合は、最後の3桁の数字の前にドットを追加するか(user79743の説明で提案されているように)、最後の3桁を削除して次に渡しますdate -d

直接入力すると、誤った結果が表示されます。

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

最後の3桁の数字の前にドットを追加してください。

$ date -d @1455086371.603
Tue Feb  9 22:39:32 PST 2016     #Correct

または、最後の3桁を削除します。

$ date -d @1455086371
Tue Feb  9 22:39:31 PST 2016      #Correct after removing the last three digits. You may remove and round off the last digit too.

答え3

date -d @11900000001190000000をその時代に変えてください。

答え4

以下を持っているbash-4.2かそれ以上:

$ printf '%(%FT%T%z)T\n' 1234567890
2009-02-13T23:31:30+0000

(ここでは、%FT%T%z-type形式、UTCオフセット()をstrftime()含む標準の明示的な形式が使用されます。)%z

この構文はからインスピレーションを受けましたksh93

ただし、ksh93パラメーターは日付式として扱われ、そのための多様でほとんど文書化されていない形式がサポートされています。

Unix 時代の場合、構文は次ksh93のとおりです。

printf '%(%FT%T%z)T\n' '#1234567890'

ksh93ただし、独自のタイムゾーンアルゴリズムを使用しているように見え、間違っている可能性があります。たとえば、イギリス本土では1970年に一年中夏でした。

$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan  1 00:00:00 1970

ksh93(そしてzshstrftime組み込み)1秒未満の速度をサポートしていますが、まだbashはサポートしていません。

$ ksh -c 'printf "%(%FT%T.%6N%z)T\n" 1234567890.123456789'
2009-02-13T23:31:30.123456-0000
$ zsh -c 'zmodload zsh/datetime; strftime %FT%T.%6.%z 1234567890 123456780'
2009-02-13T23:31:30.123457+0000

関連情報