回答:
GNUを使用すると、次のdate
ことができます。
date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969
(From:BASH:Unixタイムスタンプを日付に変換)
OS Xでは、を使用しますdate -r
。
date -r "$TIMESTAMP"
または、を使用しますstrftime()
。シェルから直接利用することはできませんが、gawkを介してアクセスできます。%c
指定子は、ロケールに依存した方法でタイムスタンプを表示します。
echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
このソリューションは、をサポートしない日付のバージョンで動作しますdate -d @
。AWKやその他のコマンドは必要ありません。Unixタイムスタンプは、1970年1月1日(UTC)からの秒数なので、UTCを指定することが重要です。
date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012
Macを使用している場合は、次を使用します。
date -r 1357004952
エポックを取得するためのコマンド:
date +%s
1357004952
クレジットはアントンに送られます:BASH:Unixタイムスタンプを日付に変換します
@TomMcKenzieが別の回答へのコメントで述べているようにdate -r 123456789
、Unix Epochから秒として指定された時間に対しては、おそらくより一般的な(つまり、より広く実装された)単純なソリューションですが、残念ながらユニバーサルポータブルソリューションは保証されていません。
-d
多くのタイプのシステムでのオプションは、GNU Dateの--date
拡張とはまったく異なるものを意味します。悲しいことに、GNU Dateは-r
これらの他の実装と同じように解釈しません。そのため、残念ながらdate
、使用しているバージョンを知る必要があり、多くの古いUnix date
コマンドはどちらのオプションもサポートしていません。
さらに悪いことに、POSIX はコマンドラインからUNIX時間をフォーマットする(私が知っている)コマンドをまったくdate
認識せず、-d
まったく-r
提供しません(POSIX Awkにもがないためstrftime()
)。(あなたが使用することはできませんtouch -t
し、ls
前者はUnixのエポックからの秒数として与えられた時間は受け付けませんので。)
ただし、Brian Kernighanから直接入手できるOne True Awkには、strftime()
組み込みsystime()
関数と、Unixエポック以降の現在の時間を秒単位で返す関数があるため、おそらくAwkソリューションが最も移植性が高いでしょう。
上記のdabest1の回答を少し修正。タイムゾーンをGMTではなくUTCとして指定します。
$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014
2つ目は正しいです。その理由は、英国では1968年から1971年まで継続的に夏時間が実施されていたためだと思います。
標準のPerlソリューションは次のとおりです。
echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'
(または、必要に応じて現地時間)