如何在Bash中将时间戳转换为日期?

时间:2010-03-03 12:41:17

标签: bash date unix-timestamp

我需要一个将Unix时间戳转换为日期的shell命令或脚本。输入可以来自第一个参数或来自stdin,允许以下使用模式:

ts2date 1267619929

echo 1267619929 | ts2date

两个命令都应输出“Wed Mar 3 13:38:49 2010”。

16 个答案:

答案 0 :(得分:459)

在以后版本的常见Linux发行版中,您可以使用:

date -d @1267619929

答案 1 :(得分:145)

date -r <number>

适用于Mac OS X.

答案 2 :(得分:27)

此版本类似于 chiborg的答案,但不再需要外部ttycat。它使用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

答案 3 :(得分:17)

您可以使用GNU日期,例如

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"

$ date -ud @1267619929

答案 4 :(得分:10)

您可以使用这个简单的awk脚本:

#!/bin/gawk -f   
{ print strftime("%c", $0); }

样本用法:

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$

答案 5 :(得分:6)

我在转换日志文件或监控它们时使用它:

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

答案 6 :(得分:5)

自Bash 4.2起,您可以使用printf&#39; %(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

答案 7 :(得分:3)

我自己写了一个脚本:

#!/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); }'

答案 8 :(得分:3)

在这个答案中,我复制了Dennis Williamson的答案,并稍微修改了一下,以便在将许多时间戳的列连接到脚本时大幅提高速度。例如,在我的机器上使用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

答案 9 :(得分:3)

在OSX或BSD中,有一个等效的-r标志,显然需要一个unix时间戳。这是一个运行日期四次的例子:第一次约会,显示它是什么;一个用于转换为%s的unix时间戳,最后一个用-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

答案 10 :(得分:1)

一些例子:

$ 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


答案 11 :(得分:1)

您可以像这样从时间戳获取格式化的日期

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"

答案 12 :(得分:0)

虽然不是纯bash,但以下脚本将使用perl将字符串中长度为13的时间戳转换为本地时区中的等效日期

timestamp_to_date.sh

#!/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"}

答案 13 :(得分:0)

我使用这种跨平台的单线:

date -d @1267619929 2>/dev/null || date -r 1267619929

它可以在macOS和普通Linux发行版的更高版本中使用。

答案 14 :(得分:0)

我必须在bash历史记录中内嵌时间戳,以便对我有意义。

也许从How do I replace a substring by the output of a shell command with sed, awk or such?的答案中得到的以下内容也可能使其他读者感兴趣。 原始sed内联代码的荣誉在于@Gabriel。

cat ~/.bash_history | sed "s/^#\([0-9]\+\)$/echo -n '#'; date -u --d @\1 '\+\%Y-\%m-\%d \%T'/e" | less

答案 15 :(得分:-7)

在PHP中

$unix_time = 1256571985;

echo date("Y-m-d H:i:s",$unix_time)