我需要一个shell命令或脚本,将Unix时间戳转换为日期。输入可以来自第一个参数,也可以来自stdin,允许以下使用模式:
ts2date 1267619929
and
echo 1267619929 | ts2date
这两个命令都应该输出“Wed Mar 3 13:38:49 2010”。
我需要一个shell命令或脚本,将Unix时间戳转换为日期。输入可以来自第一个参数,也可以来自stdin,允许以下使用模式:
ts2date 1267619929
and
echo 1267619929 | ts2date
这两个命令都应该输出“Wed Mar 3 13:38:49 2010”。
当前回答
你可以像这样从时间戳中得到格式化的日期
date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"
其他回答
这个版本与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
我在转换日志文件或监控它们时使用这个:
tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'
我使用这个跨平台的一行代码:
date -d @1267619929 2>/dev/null || date -r 1267619929
它应该可以在macOS和流行的Linux发行版的现代版本中运行。
在这个答案中,我复制了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
例如,你可以使用GNU日期,
$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
or
$ date -ud @1267619929