代码之家  ›  专栏  ›  技术社区  ›  chiborg Alessandro Minoccheri

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

  •  216
  • chiborg Alessandro Minoccheri  · 技术社区  · 15 年前

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

    ts2date 1267619929
    

    echo 1267619929 | ts2date
    

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

    12 回复  |  直到 7 年前
        1
  •  440
  •   a'r    15 年前

    在最新版本的通用Linux发行版上,您可以使用:

    date -d @1267619929
    
        2
  •  137
  •   Mundi    8 年前
    date -r <number>
    

    在Mac OS X上为我工作。

        3
  •  25
  •   Dennis Williamson    7 年前

    此版本与 希博格 答案,但它消除了对外部的需求 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
    
        4
  •  15
  •   Peter Mortensen icecrime    9 年前

    例如,可以使用GNU日期,

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

    $ date -ud @1267619929
    
        5
  •  10
  •   codaddict    15 年前

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

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

    样品使用情况:

    $ echo '1098181096' | ./a.awk 
    Tue 19 Oct 2004 03:18:16 AM PDT
    $
    
        6
  •  4
  •   Emissary    11 年前

    我在转换或监视日志文件时使用此选项:

    tail -f <log file> | gawk \
    '{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'
    
        7
  •  3
  •   chiborg Alessandro Minoccheri    15 年前

    我自己写了一个脚本:

    #!/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
  •   webb    10 年前

    在这个答案中,我复制了丹尼斯·威廉姆森的答案,并对其进行了轻微的修改,以便在将多个时间戳的一列管道传输到脚本时,可以大幅提高速度。例如,在我的机器上用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
    
        9
  •  2
  •   gniourf_gniourf    7 年前

    因为bash 4.2可以使用 printf %(datefmt)T 格式:

    $ printf '%(%c)T\n' 1267619929
    Wed 03 Mar 2010 01:38:49 PM CET
    

    这很好,因为它是一个壳内置。格式 数据流 是否接受字符串 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
    
        10
  •  2
  •   erik258    7 年前

    在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
    
        11
  •  1
  •   kai    9 年前

    一些例子:

    $ 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
    
    
    
        12
  •  -7
  •   Lucas    15 年前

    在PHP中

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