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

ts2date 1267619929

and

echo 1267619929 | ts2date

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


当前回答

在OSX或BSD中,有一个等效的-r标志,它显然接受unix时间戳。下面是一个运行date四次的示例:一次是第一次约会,以显示它是什么;一个用于转换为使用%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

其他回答

如果你想一次格式化多个时间戳,我写了一个名为datefmt的C util,它在文本流中格式化时间戳:

假设我们有一些包含unix时间戳的日志:

$ cat logs.txt

EVENTS  1638499687   blahblah log1
EVENTS  1638499717   blahblah log2

我们可以将该日志管道到datefmt中,将这些时间戳转换为人类可读的日期:

$ <logs.txt datefmt

EVENTS  2021-12-02 18:48   blahblah log1
EVENTS  2021-12-02 18:48   blahblah log2

当然,你也可以自定义格式:

$ <logs.txt datefmt "DATE:'%m-%d %R'"

EVENTS  DATE:'12-02 18:48'   blahblah log1
EVENTS  DATE:'12-02 18:48'   blahblah log2

我已经在NixOS中打包了它,希望它很快就会渗透到其他发行版中,但现在你需要下载tarball并使用make构建它

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

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

or

$ date -ud @1267619929

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

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

我必须在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

虽然不是纯bash,但下面的脚本将使用perl将字符串中长度为13的时间戳转换为本地时区中的等效日期

timestamp_to_date.sh

#!/usr/bin/env bash
IT=$(cat /dev/stdin)
re='(.*)([0-9]{13})(.*)'
while [[ $IT =~ $re ]]; do
  TIMESTAMP=${BASH_REMATCH[2]}
  AS_DATE=$(echo "$TIMESTAMP" | perl -pe 's/([\d]{10})([\d]{3})/localtime $1/eg;')
  IT="${IT/$TIMESTAMP/$AS_DATE}"    
done
echo "$IT"

输入

{"timestamp":"1573121629939","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

输出

$ cat input | timestamp_to_date.sh

{"timestamp":"Thu Nov  7 06:13:49 2019","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}