コマンドラインからUNIXタイムスタンプの書式設定された日付を取得する方法


59

UNIXタイムスタンプがありdate、そのタイムスタンプに対応する書式設定された日付(の出力など)を取得したいです。

これまでの私の試み:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

次のような出力を取得できるようにしたいと思います。

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

回答:


92

Mac OS XおよびBSDの場合:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

GNUコアツールを使用します(そのための情報ファイルを掘り下げる必要があります)。

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

-u(標準)オプションを追加するか、TZ=UTC0環境変数を渡してUTC日付を取得します(UTC からオフセット0で呼び出されるタイムゾーンをTZ=UTC0 定義し、(オフセットなし)の動作は指定されていません(ほとんどのシステムではシステム定義のタイムゾーンもUTCからのオフセット0で呼び出されます))。UTCTZ=UTCUTC


1
しかし、それは多くの掘削を必要とし、それはそのような一般的なタスクにとって驚くべきことです。
デビッドZ

ありがとう、あなたの答えを受け入れました。info coreutils dateもう少し注意深く読んでおくべきでした。
ウマン

これは私にわずかに異なる日付を与えています:実際にdate -r 1447264553943Wed Dec 28 01:39:03 BRST 47831、という結果になり11/11/2015, 3:55:53 PM GMT-2:00ます。
falmp

1
@falmp:マイクロ秒の代わりに秒を使用すると機能します。

@hop opsは、47831である年と考えるべきでしたが、その数が多すぎて見逃していました。ありがとう!
-falmp

6

いくつかのグーグルの後、dateコマンドのみでそれを行う方法を見つけました:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

ありがとう。もっとシンプルなものがあればいいのにと思っていたので、今のところは賛成票を投じるだけです。
ウマン

グーグルがあなたをバカにする方法の別の素晴らしい例。誰もドキュメントを読んだことがありませんか?

1
@hopのサポートはdate -d @xxx、2005年にcoreutils 5.3まで追加されませんでした。それまでは、それを行う必要がありました。
ステファンシャゼラス

@StéphaneChazelas:a)この回答は2010年のもので、b)ドキュメントを読む前にグーグルを言い訳するのはなぜですか?あなたがあなた自身の権威から答えるならば、人はこのような誤りをすることを言い訳することができます、しかし、とにかくそれを調べなければならないならば、それを正しく調べてください。

@hop、私はそれが愚かな答えではなく、ただ時代遅れの答えであると指摘していました。
ステファンシャゼル

6

このperlワンライナーはそれを行います:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010

5

シェルビルトインの場合:

  • zsh (4.1.1(2003)以降):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93ksh93i(2000)以降):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2(2010)以降):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

これらすべて%cで、必要なstrftime()形式に置き換えます。


bash printfソリューションのリファレンスはありますか?
デレクマハール

気にしないでprintfgnu.org/software/bash/manual/bashref.html#Bash-Builtinsの説明で見つけました。
デレクマハール


1

現代のUnixの豊かな遺産のもう1つの端正な例。これは、ほとんどのBSDバリアントで実際に可能です。

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(ところであなたの例は1秒ずれているようです)


Linuxでは機能しません。ホップの答えは正しいLinuxの答えを持っているようです。それを指摘してくれてありがとう、私はそのようなことが起こるのではないかと疑っていました。45秒になりました。
ウマン

1

古い質問に答えますが、他の誰かがこれを検索した場合、これは改善になると思います。このBash関数は、LinuxとOS Xの両方で機能します。他のBSDシステムではテストしていません。エポック時間をこの関数の引数として渡すと、RFC-3339時間形式が出力されます。

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.