如何将时间戳转换为Bash中的date?
我需要一个将Unix时间戳转换为date的shell命令或脚本。 input可以来自第一个参数或来自stdin,允许以下使用模式:
ts2date 1267619929 和
 echo 1267619929 | ts2date 
这两个命令都应该输出“Wed Mar 3 13:38:49 2010”。
在更高版本的普通Linux发行版上,您可以使用:
 date -d @1267619929 
 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 -rp else echo "No timestamp given." >&2 exit fi else p=$1 fi date -d "@$p" +%c 
你可以使用这个简单的awk脚本:
 #!/bin/gawk -f { print strftime("%c", $0); } 
示例用法:
 $ echo '1098181096' | ./a.awk Tue 19 Oct 2004 03:18:16 AM PDT $ 
例如,您可以使用GNUdate,
 $ sec=1267619929 $ date -d "UTC 1970-01-01 $sec secs" 
要么
 $ date -ud @1267619929 
我在转换日志文件或监视日志文件时使用这个:
 tail -f <log file> | gawk \ '{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }' 
在这个答案中,我复制了Dennis Williamson的答案并略微修改了它,以便在将许多时间戳的列传送到脚本时允许大幅提高速度。 例如,在我的机器上使用xargs -n1在原始脚本上pipe理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 
我已经写了一个脚本,自己做这个:
 #!/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); }' 
 在OSX或BSD中,有一个等效的-r标志,显然需要一个unix时间戳。 下面是一个运行date四次的例子:第一次约会,显示它是什么; 一个用于将%s转换为unix时间戳,最后一个用-r将%s提供的内容转换回string。 
 $ date; date +%s; date -r `date +%s` Tue Oct 24 16:27:42 CDT 2017 1508880462 Tue Oct 24 16:27:42 CDT 2017 
至less,似乎在我的机器上工作。
 $ 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 
一些例子:
$date Tue Mar 22 22: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 22:47:06 CST 2016 $ date --date ='@ 1458636426' Tue Mar 22 22:47:06 CST 2016
 既然Bash 4.2可以使用printf的%(datefmt)T格式: 
 $ printf '%(%c)T\n' 1267619929 Wed 03 Mar 2010 01:38:49 PM CET 
 这很好,因为它是一个内置的shell。  datefmt的格式是strftime(3)接受的string(参见man 3 strftime )。 这里%c是: 
%c当前语言环境的首选date和时间表示forms。
现在,如果您想要一个接受参数的脚本,并且如果没有提供任何参数,则可以读取stdin,您可以按照下列步骤操作:
 #!/bin/bash if (($#)); then printf '%(%c)T\n' "$@" else while read -r line; do printf '%(%c)T\n' "$line" done fi 
在PHP中
 $unix_time = 1256571985; echo date("Ymd H:i:s",$unix_time)