将Unix时间戳转换为日期字符串

167

有没有一种简单的方法可以在Unix命令行中快速将Unix时间戳转换为日期?

date 命令可能可行,但是指定每个元素(月、日、年、小时等)非常笨拙,而且我无法弄清楚如何使它正常工作。看起来可能有更简单的方法,我错过了什么吗?


3
可能是重复问题:如何在Bash中将时间戳转换为日期? - user
12个回答

242

使用来自GNU coreutilsdate命令,你可以做到:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(来源: BASH: 将Unix时间戳转换为日期)

在OS X上,使用date -r

date -r "$TIMESTAMP"

或者使用 strftime()。它不是直接从shell中使用的,但你可以通过gawk访问它。 %c 格式化说明符以区域设置相关的方式显示时间戳。

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

6
请确保从时间戳中删除毫秒部分(只保留10位数字而非13位),否则会得到无效结果(这适用于 macOS 中的日期)。 - emerino
我以为这个不起作用,直到我意识到我有一个毫秒级的时间戳。去掉最后三位数字,你就能得到准确的时间。 - Stewart
“Convert Unix Timestamp”链接已经失效。存档版本:https://web.archive.org/web/20200930143943/https://www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-date/。我本来想编辑帖子并更新URL,但是编辑队列已满。 - AJM

81

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' 其中@后面的数字表示秒数。


33
在OSX 10.8上,命令是 date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(格林威治标准时间),或者简单地使用date -r 1278999698 - Tom McKenzie
适用于Ubuntu 16.04。 - Mike Q

29

这个解决方案适用于不支持date -d @的日期版本。它不需要AWK或其他命令。Unix时间戳是自1970年1月1日UTC以来的秒��,因此在输入中指定UTC非常重要。

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

如果您使用的是Mac,则请使用:

date -r 1357004952

获取时代的命令:

date +%s
1357004952

感谢Anton: BASH:将Unix时间戳转换为日期


2
URL已过期,请使用存档版本:https://web.archive.org/web/20200930143943/https://www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-date/ - AJM
指定UTC标志比这个简单得多:::gnu-date -u -d'@1357004952'bsd-date -u -r 1357004952 :: 2013年1月1日星期二01:49:12 UTC 2013年1月1日星期二01:49:12 UTC - RARE Kpop Manifesto
你可能误读了答案。我的答案适用于当您没有支持date -d @,并且想要在本地时区显示输出的情况。 - dabest1

11
正如@TomMcKenzie在另一个答案的评论中所说,date -r 123456789是一个更常见(即更广泛实现)的简单解决方案,用于表示自Unix纪元以来的秒数,但不幸的是没有通用的保证可移植的解决方案。
在许多类型的系统上,-d选项意味着与GNU Date的--date扩展完全不同的东西。 不幸的是,GNU Date不能像其他实现一样解释-r。 因此,您必须知道您正在使用哪个版本的date,而许多旧的Unix date命令都不支持这两个选项。
更糟糕的是,POSIX date既不认识-d也不认识-r,并且在任何命令中都没有提供标准的方式(据我所知)从命令行格式化Unix时间(因为POSIX Awk也缺少strftime())。 (您不能使用touch -tls,因为前者不接受作为自Unix纪元以来的秒数给出的时间。)
请注意,直接从Brian Kernighan获取的The One True Awk现在已经内置了strftime()函数以及一个systime()函数,用于返回自Unix纪元以来的当前时间(秒),因此Awk解决方案可能是最便携的。

5
稍作更正,dabest1上面的答案有误。请将时区指定为UTC,而非GMT:
$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

第二个是正确的。我认为原因是在英国,夏令时从1968年持续到1971年。

干得好,发现了那个意料之外的边角案例! - AJM
在Windows 10上使用Git Bash,以上命令的GMT和UTC版本输出相同的内容 - Tue Nov 18 01:53:03 GMTST 2014 - AJM
你确定你正在使用Bash吗?这个独特的输出可能来自Korn shell吗? - AJM

4
如果你觉得这种记法很别扭,也许使用-R选项会有所帮助。它以RFC 2822格式输出日期,这样你就不需要所有的标识符了:date -d @1278999698 -R。另一种可能是在本地以秒为单位输出日期:date -d @1278999698 +%c。应该很容易记住。 :-)

2
标准的Perl解决方案是:
echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(或者优先使用本地时间)

2

其他例子都很难记住。最简单的情况是:


date -r 1305712800

1
混合结果:例如在Mac OS X中可以工作,但在Ubuntu Linux中无法工作。 - Mike Q

1
将以下内容放入您的~/.bashrc文件中:
function unixts() { date -d "@$1"; }

使用示例:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

1
awk 'BEGIN { print strftime("%c", 1271603087); }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接