Answers:
在普通Linux发行版的更高版本上,您可以使用:
date -d @1267619929
@用 我在GNU手册页中根本看不到。
brew install coreutils; gdate -d @1267619929
info 'Date input formats' 将您直接带到date的formatting info节点,并带有相关的Robert Grudin引号,然后是格式说明符菜单。
date -r <number>
在Mac OS X上对我有效。
这个版本类似于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
gawk(大约)比仅包含或将输出重定向到date的定时for循环快15%。gawk 'BEGIN { print strftime("%c", 1256571985); }'date -d '@1256571985' +%c/dev/null
从Bash 4.2开始,您可以使用printf的%(datefmt)T格式:
$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET
很好,因为它是内置的shell。datefmt的格式是被strftime(3)(参见man 3 strftime)接受的字符串。这里%c是:
%c当前语言环境的首选日期和时间表示形式。
现在,如果您想要一个接受参数的脚本,并且如果未提供参数,则读取stdin,则可以执行以下操作:
#!/bin/bash
if (($#)); then
printf '%(%c)T\n' "$@"
else
while read -r line; do
printf '%(%c)T\n' "$line"
done
fi
在OSX或BSD中,有一个等效-r标志,显然需要一个unix时间戳。这是一个运行日期四次的示例:一次是第一次显示日期,另一次是显示日期。一个用于使用转换为unix时间戳%s,最后一个用于使用-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
我写了一个脚本来自己做:
#!/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); }'
在此答案中,我复制了丹尼斯·威廉姆森的答案,并对其进行了稍微的修改,以在将包含多个时间戳记的列传递到脚本时大大提高速度。例如,在我的计算机上使用xargs -n1将1000个时间戳传递到原始脚本需要6.929s,而使用此修改后的版本需要0.027s:
#!/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
虽然不是纯bash,但以下脚本将使用perl将字符串中长度为13的时间戳转换为本地时区中的等效日期
#!/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"}
date -d @$(date -u +%s)