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

chi*_*org 251 bash date unix-timestamp

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

ts2date 1267619929
Run Code Online (Sandbox Code Playgroud)

echo 1267619929 | ts2date
Run Code Online (Sandbox Code Playgroud)

两个命令都应输出"Wed Mar 3 13:38:49 2010".

a'r*_*a'r 490

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

date -d @1267619929
Run Code Online (Sandbox Code Playgroud)

  • 什么是`@` for?我根本没有在GNU手册页中看到这一点. (24认同)
  • @mehaase - 手册页指出日期字符串太复杂,无法在联机帮助页中记录,因此在info:**info'(coreutils)日期调用'**中有描述 (12认同)
  • `brew install coreutils; gdate -d @ 1267619929` (9认同)
  • 单行:`date -d @ $(date -u +%s)` (4认同)
  • “info 'Date input Formats'” 可让您直接进入“date”的格式信息节点,其中包含相关的 Robert Grudin 引用,然后是格式说明符菜单。 (4认同)

小智 156

date -r <number>
Run Code Online (Sandbox Code Playgroud)

在Mac OS X上适用于我.

  • 虽然对此答案的评论是真实的,但这些不是拉法的错,并且它们并没有削弱他的答案。 (6认同)
  • 是的,但它不会处理一秒钟. (5认同)

Pau*_*ce. 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
Run Code Online (Sandbox Code Playgroud)

  • @Bruno,@ ghostdog74:在我的系统上,`gawk`比'date`在一个定时`for`循环中(非常粗略地)快15%,只包含`gawk'BEGIN {print strftime("%c",1256571985) ; ''或`date -d'@ 1256571985'+%c`,输出重定向到`/ dev/null`. (3认同)
  • 请注意,我的答案符合问题中所述的OP要求,但现在接受的答案却没有. (3认同)

gho*_*g74 17

例如,您可以使用GNU日期

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
Run Code Online (Sandbox Code Playgroud)

要么

$ date -ud @1267619929
Run Code Online (Sandbox Code Playgroud)


Bla*_*ago 15

我使用这个跨平台单行:

date -d @1267619929 2>/dev/null || date -r 1267619929
Run Code Online (Sandbox Code Playgroud)

它应该可以在 macOS 和流行 Linux 发行版的现代版本中运行。


cod*_*ict 10

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

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

样品用法:

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$
Run Code Online (Sandbox Code Playgroud)


小智 8

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

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"
Run Code Online (Sandbox Code Playgroud)

  • 其他方式: date -ud "@1585667718" +'%Y-%m-%d %H:%M:%S' (4认同)

gni*_*urf 7

从Bash 4.2开始,您可以使用printf%(datefmt)T格式:

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

很好,因为它是内置的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
Run Code Online (Sandbox Code Playgroud)


小智 6

在转换日志文件或监视它们时,我会用到它:

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


Dan*_*ell 6

在 OSX 或 BSD 中,有一个等效的-r标志,它显然采用 unix 时间戳。这是一个运行四次 date 的示例:一次是第一次约会,以显示它是什么;一个用于使用 转换为 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
Run Code Online (Sandbox Code Playgroud)

至少,似乎在我的机器上工作。

$ 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
Run Code Online (Sandbox Code Playgroud)