web-dev-qa-db-ja.com

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

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

dateは機能する可能性がありますが、各要素(月、日、年、時間など)を指定するのがやや面倒で、適切に機能させる方法がわかりません。もっと簡単な方法があるかもしれないようです-私は何かを見逃していますか?

111
chimeracoder

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
151
John Kugelman

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

58
qbi

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

21
dabest1

@TomMcKenzieが別の答えへのコメントで述べているように、date -r 123456789は間違いなくUnixエポックからの秒数として与えられた時間のためのより一般的な(すなわち、より広く実装された)シンプルなソリューションですが、残念ながら普遍的な保証されたポータブルなソリューションはありません。

多くのタイプのシステムでの-dオプションは、GNU Dateの--date拡張とはまったく異なるものを意味します。悲しいことにGNU Dateは-rをこれらの他の実装と同じように解釈しません。残念ながら、使用しているdateのバージョンを知る必要があり、多くの古いUnix dateコマンドはどちらのオプションもサポートしていません。

さらに悪いことに、POSIX date-d-rも認識せず、コマンドラインからUnix時間をフォーマットするための標準的な方法をまったく提供しません(POSIX以降)。 Awkにもstrftime())がありません。 (touch -tlsは使用できません。前者は、Unixエポック以降の秒として指定された時間を受け入れないためです。)

ただし、Brian Kernighanから直接入手できるOne True Awkには、strftime()関数と、Unixエポック以降の現在の時刻を秒単位で返すsystime()関数が組み込まれています。 Awkソリューションは最もポータブルです。

9
Greg A. Woods

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

4
qbi

ここの他の例は覚えにくいです。最も簡単なもの:

date -r 1305712800
2
denmojo

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

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

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

2
William Pursell

上記の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
awk 'BEGIN { print strftime("%c", 1271603087); }'
1
Sjoerd

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

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

使用例:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
0
Dangelov