我需要一个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 -d @1267619929 2>/dev/null || date -r 1267619929
它应该可以在macOS和流行的Linux发行版的现代版本中运行。
其他回答
一些例子:
$ 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
从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是:
当前的首选日期和时间表示形式 语言环境。
现在,如果你想要一个接受参数的脚本,如果没有提供参数,则读取stdin,你可以继续执行:
#!/bin/bash
if (($#)); then
printf '%(%c)T\n' "$@"
else
while read -r line; do
printf '%(%c)T\n' "$line"
done
fi
我自己写了一个脚本:
#!/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); }'
这个版本与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
我必须在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