我需要一个shell命令或脚本,将Unix时间戳转换为日期。输入可以来自第一个参数,也可以来自stdin,允许以下使用模式:

ts2date 1267619929

and

echo 1267619929 | ts2date

这两个命令都应该输出“Wed Mar 3 13:38:49 2010”。


当前回答

在GNU Coreutils >= 5.3.0的系统上,例如Linux,您可以使用:

date -d @1267619929

其他回答

date -r <number>

在Mac OS X上适用。

例如,你可以使用GNU日期,

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

or

$ date -ud @1267619929

我在转换日志文件或监控它们时使用这个:

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

我喜欢以前的特殊情况下的解决方案:printf '%(%c)T\n' $timestamp(如果你有Bash>=4.2), date -d @$timestamp(如果你有GNU Coreutils >= 5.3.0), date -r $timestamp(如果你是BSD/MacOS),但我需要一些更可移植的东西,我选择了jq,我到处都有JSON的帮助:

jq 'todate' <<< $timestamp

可以在函数中使用,以获得所需的效果:

ts2date() { [[ -n "$1" ]] && { jq 'todate' <<< $1 ; true;} || jq 'todate' ; }

这个版本与chiborg的答案相似,但它消除了外部tty和cat的需要。它使用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