如何从命令行获取UNIX时间戳的格式化日期


59

我有一个UNIX时间戳,我想获取一个date与该时间戳相对应的格式化日期(如的输出)。

到目前为止,我的尝试:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

我希望能够得到如下输出:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

Answers:


91

在Mac OS X和BSD上:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

使用GNU核心工具(您必须为此浏览信息文件):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

使用任一方法,添加-u(标准)选项,或传递TZ=UTC0环境变量以具有UTC日期(TZ=UTC0 定义了一个时区,UTC与UTC的偏移量为0,而未TZ=UTC指定(无偏移量)的行为(尽管在大多数系统上,该行为是指系统定义的时区,也称为UTCUTC偏移量0)。


1
但是,这需要大量的挖掘工作,这对于如此常见的任务是令人惊讶的。
David Z

谢谢,接受了您的回答。我应该info coreutils date仔细阅读一些。
Umang 2010年

这给了我一个稍微不同的日期:date -r 1447264553943结果是Wed Dec 28 01:39:03 BRST 47831,实际上是11/11/2015, 3:55:53 PM GMT-2:00
falmp

1
@falmp:如果您使用秒而不是微秒,它将起作用。

@hop ops,应该算是47831,但是这个数字太高了,我错过了。谢谢!
falmp

6

经过一番谷歌搜索后,我找到了date仅使用命令的方法:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

感谢那。我希望可以有一些简单的方法,所以现在就进行投票。
Umang

谷歌如何使你变得愚蠢的另一个很好的例子。没有人再读过文档了吗?

1
@hop,date -d @xxx直到2005年的coreutils 5.3才添加对它的支持。在那之前,您必须这样做。
斯特凡Chazelas

@StéphaneChazelas:a)这个答案来自2010年,b)为什么在阅读文档之前会谷歌搜索?如果您是根据自己的权限回答的,则可以以这样的错误为借口,但是如果您仍然必须查找它,请正确查找它。

@hop,我只是指出这不是一个愚蠢的答案,只是一个过时的答案。
斯特凡Chazelas

6

这种perl线性代码可以做到:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010

5

使用shell内置程序:

  • zsh (4.1.1(2003)及以上):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93ksh93i(2000年及以上):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2(2010)及以上):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

在所有这些中,替换%c为所需的strftime()格式。


您有bash printf解决方案的参考吗?
德里克·马哈

没关系,我printfgnu.org/software/bash/manual/bashref.html#Bash-Builtins的描述中找到了它。
德里克·马哈

2

在osx上,具有UTC

date -r "1475737200" -u

谢谢。我已经在接受的答案中进行了编辑,以便可以更轻松地获取信息。
斯特凡Chazelas

1

现代Unix丰富遗产的另一个很好的例子。在大多数BSD变体中,这确实是可能的:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(顺便说一句,您的示例似乎偏离了一秒钟)


在Linux上不起作用。Hop的答案似乎具有正确的Linux答案。感谢您指出这一点,我怀疑类似事情会发生,我现在已经完成了45秒。
Umang 2010年

1

回答一个古老的问题,但是我认为如果其他人对此进行搜索,则可能会有所改善。该Bash函数在Linux和OS X上均可使用。我尚未在任何其他BSD系统上进行测试。将纪元时间作为此函数的参数传递,它将打印RFC-3339时间格式。

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.