web-dev-qa-db-ja.com

タイムスタンプをBashで日付に変換する方法?

Unixのタイムスタンプを日付に変換するシェルコマンドまたはスクリプトが必要です。入力は最初のパラメータまたは標準入力のどちらからでも可能で、次の使用パターンが可能です。

ts2date 1267619929

そして

echo 1267619929 | ts2date

どちらのコマンドも「Wed Mar 3 13:38:49 2010」と出力します。

228
chiborg

一般的なLinuxディストリビューションの最新バージョンでは、次のものを使用できます。

date -d @1267619929
460
a'r
date -r <number>

私はMac OS X上で動作します。

145
rafaelzlisboa

このバージョンはchiborg's answerに似ていますが、外部のttycatの必要性を排除します。これはdateを使用しますが、gawkも同様に簡単に使用できます。 Shebangを変更して二重の角括弧を単一の角括弧に置き換えることができます。これはshでも実行されます。

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        read -r p
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    p=$1
fi
date -d "@$p" +%c
27

たとえば、GNU dateを使用できます。

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"

または

$ date -ud @1267619929
17
ghostdog74

この単純なawkスクリプトを使うことができます。

#!/bin/gawk -f   
{ print strftime("%c", $0); }

使用例

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$
10
codaddict

ログファイルを変換したり監視したりするときにこれを使用します。

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'
6
user3544224

Bash 4.2以降、printf%(datefmt)Tフォーマットを使用できます。

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

それはいいです、それはシェル組み込みだからです。 datefmtの形式は、strftime(3)が受け付ける文字列です(man 3 strftimeを参照)。これは%cです:

%c現在のロケールに適した日時表現。


引数を受け付けるスクリプトが必要で、引数が何も指定されていない場合は標準入力と読み替えたいのであれば、次のように進めます。

#!/bin/bash

if (($#)); then
    printf '%(%c)T\n' "$@"
else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi
5
gniourf_gniourf

この回答では、Dennis Williamsonの回答をコピーして、スクリプトに多数のタイムスタンプの列をパイプ処理するときに速度が大幅に向上するように少し修正します。たとえば、私のマシンでxargs -n1を使ってオリジナルのスクリプトに1000個のタイムスタンプを渡すと、6.929秒かかりました。これは、この修正版では0.027秒でした。

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    date -d @$1 +%c
fi
3
webb

OSXやBSDには、同等の-rフラグがあり、これは明らかにunixタイムスタンプを取ります。これは、dateを4回実行する例です。最初のdateに1回、それが何であるかを示すために。ひとつは%sを使ったunixタイムスタンプへの変換用で、もうひとつは-rを使って%sが提供するものを文字列に変換するものです。

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017

少なくとも、私のマシンではうまくいくようです。

$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
3
Daniel Farrell

私はこれを自分で行うスクリプトを書きました。

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fi
else
    p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'
3
chiborg

あなたはこのようなタイムスタンプからフォーマットされた日付を得ることができます

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"
1
andranikasl

いくつかの例:

 $ date 
火曜日22 16:47:06 CST 2016 
 
 $ date -d "火曜日22 16:47:06 CST 2016" + %s "[
] 1458636426 
 
 $ date +%s [
] 1458636453 
 [
] [$ ____] ] 2016年3月22日火曜日16:47:06 CST 2016 
 
 $ date --date = '@ 1458636426' 
 CST 2016年2月22日16:47:06 ] 
 
1
kai