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

ts2date 1267619929

and

echo 1267619929 | ts2date

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


当前回答

我必须在bash历史记录中转换内联的时间戳,以便对我有意义。

也许下面的答案来自于我如何用sed, awk或这样的shell命令的输出替换子字符串?其他读者也会感兴趣。 原始sed内联代码的荣誉归于@Gabriel。

cat ~/.bash_history | sed "s/^#\([0-9]\+\)$/echo -n '#'; date -u --d @\1 '\+\%Y-\%m-\%d \%T'/e" | less

其他回答

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

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

or

$ date -ud @1267619929

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

date -d @1267619929

一些例子:

$ date
Tue Mar 22 16:47:06 CST 2016

$ date -d "Tue Mar 22 16:47:06 CST 2016" "+%s"
1458636426

$ date +%s
1458636453

$ date -d @1458636426
Tue Mar 22 16:47:06 CST 2016

$ date --date='@1458636426'
Tue Mar 22 16:47:06 CST 2016


你可以像这样从时间戳中得到格式化的日期

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

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

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