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)