Unixタイムスタンプを日付文字列に変換する


127

UnixコマンドラインからUnixタイムスタンプを日付に変換する簡単な方法はありますか?

date各要素(月、日、年、時間など)を指定するのがかなり厄介で、適切に機能させる方法を理解できないことを除いて、機能する可能性があります。もっと簡単な方法があるようです-私は何かを逃していますか?


回答:


180

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

3
タイムスタンプからミリ秒(13ではなく10桁のみ)を削除してください。そうしないと、無効な結果が返されます(これはmacOSの日付に当てはまります)。
emerino

ミリ秒単位のタイムスタンプがあることに気づくまで、これは機能していないと思いました。下3桁を
Stewart

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' 後ろ@の数字は秒単位の数字です


28
OSX 10.8では、それはdate -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT)または単にdate -r 1278999698
トムマッケンジー

Ubuntu 16.04に対応
Mike Q

24

このソリューションは、をサポートしない日付のバージョンで動作します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タイムスタンプを日付に変換します


10

@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ソリューションが最も移植性が高いでしょう。


4

表記がぎこちない場合は、-R-optionが役立つかもしれません。RFC 2822形式で日付を送信します。したがって、これらすべての識別子は必要ありませんdate -d @1278999698 -R。もう1つの可能性は、ロケールで日付を秒単位で出力することですdate -d @1278999698 +%c。覚えやすいはずです。:-)


2

上記の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年まで継続的に夏時間が実施されていたためだと思います。


2

標準のPerlソリューションは次のとおりです。

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(または、必要に応じて現地時間)



1

ここの他の例は覚えるのが難しいです。最も単純な場合:

date -r 1305712800

混合結果:ubuntu Linuxでは機能しませんが、たとえばMac OS Xでは機能します。
Mike Q

1

以下を〜/ .bashrcに入れてください:

function unixts() { date -d "@$1"; }

使用例:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.