如何在Bash中将时间戳转换为日期?
我需要一个将Unix时间戳转换为日期的shell命令或脚本。 输入可以来自第一个参数或来自stdin,允许以下使用模式:
ts2date 1267619929
和
echo 1267619929 | ts2date
两个命令都应输出“Wed Mar 3 13:38:49 2010”。
12个解决方案
417 votes
在以后版本的常见Linux发行版中,您可以使用:
date -d @1267619929
a'r answered 2019-03-03T10:31:25Z
130 votes
date -r
在Mac OS X上适用于我。
rafaelzlisboa answered 2019-03-03T10:31:50Z
24 votes
这个版本类似于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
Dennis Williamson answered 2019-03-03T10:32:16Z
13 votes
例如,您可以使用GNU日期
$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
要么
$ date -ud @1267619929
ghostdog74 answered 2019-03-03T10:32:45Z
9 votes
你可以使用这个简单的awk脚本:
#!/bin/gawk -f
{ print strftime("%c", $0); }
样品用法:
$ echo '1098181096' | ./a.awk
Tue 19 Oct 2004 03:18:16 AM PDT
$
codaddict answered 2019-03-03T10:33:15Z
4 votes
我在转换日志文件或监视它们时使用它:
tail -f | gawk \
'{ printf strftime("%c", $1); for (i=2; i
user3544224 answered 2019-03-03T10:33:41Z
3 votes
我写了一个脚本,自己这样做:
#!/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 answered 2019-03-03T10:34:07Z
3 votes
在这个答案中,我复制了Dennis Williamson的答案并稍微修改它,以便在将许多时间戳的列传递给脚本时允许大幅提高速度。 例如,在我的机器上使用xargs -n1为原始脚本管道1000个时间戳需要6.929秒,而使用此修改版本需要0.027秒:
#!/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
webb answered 2019-03-03T10:34:36Z
2 votes
从Bash 4.2开始,您可以使用%c的man 3 strftime格式:
$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET
这很好,因为它是一个内置的shell。 datefmt的格式是%c接受的字符串(参见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
gniourf_gniourf answered 2019-03-03T10:35:28Z
2 votes
在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
Dan Farrell answered 2019-03-03T10:36:06Z
0 votes
一些例子:
$ 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
kai answered 2019-03-03T10:36:36Z
-7 votes
在PHP中
$unix_time = 1256571985;
echo date("Y-m-d H:i:s",$unix_time)
Lucas answered 2019-03-03T10:37:07Z