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

chi*_*der 114 unix bash shell unix-timestamp

是否有一种快速的,单行的方式将Unix时间戳转换为Unix命令行中的日期?

date可能会工作,除了指定每个元素(月,日,年,小时等)相当尴尬,我无法弄清楚如何让它正常工作.似乎可能有一种更简单的方法 - 我错过了什么吗?

Joh*_*ica 156

使用GNU,date您可以:

date -d "@$TIMESTAMP"
Run Code Online (Sandbox Code Playgroud)
# date -d @0
Wed Dec 31 19:00:00 EST 1969
Run Code Online (Sandbox Code Playgroud)

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

在OS X上,使用date -r.

date -r "$TIMESTAMP"
Run Code Online (Sandbox Code Playgroud)

或者,使用strftime().它不能直接从shell获得,但您可以通过gawk访问它.的%c说明符显示区域设置依赖性方式的时间戳.

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

  • 确保从时间戳中消除了毫秒(即只有10位而不是13位),否则您将得到无效的结果(对于macOS的日期是正确的)。 (2认同)

qbi*_*qbi 59

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' 后面@的数字是以秒为单位的数字

  • 在OSX 10.8上,它是`date -r 1278999698 +'%Y-%m-%d%H:%M:%S'`(GMT)或只是`date -r 1278999698` (26认同)

dab*_*st1 21

此解决方案适用于不支持的日期版本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
Run Code Online (Sandbox Code Playgroud)

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

date -r 1357004952
Run Code Online (Sandbox Code Playgroud)

获取纪元的命令:

date +%s
1357004952
Run Code Online (Sandbox Code Playgroud)

归功于 Anton:BASH:将Unix时间戳转换为日期

  • URL 已过时 - 请改用此存档版本:https://web.archive.org/web/20200930143943/https://www.antonolsen.com/2006/04/06/bash-convert-unix -时间戳到日期/ (2认同)

Gre*_*ods 9

正如@TomMcKenzie在对另一个答案的评论中所言,date -r 123456789可以说是一个更常见的(即更广泛实现的)简单解决方案,自Unix时代以来以秒为单位,但不幸的是,没有普遍保证的便携式解决方案.

-d许多类型的系统上的选项意味着与GNU Date的--date扩展完全不同.遗憾的是,GNU Date并不-r像其他实现那样解释相同的内容.所以不幸的是你必须知道date你正在使用哪个版本,而许多旧的Unix date命令都不支持任何一个选项.

更糟糕的是,POSIX date-d不会识别也不会-r在任何命令中提供任何标准方式(我知道)从命令行格式化Unix时间(因为POSIX Awk也缺乏strftime()).(你不能使用touch -t,ls因为前者不接受自Unix Epoch以来的秒数.)

请注意,直接来自Brian Kernighan的One True Awk现在具有strftime()内置函数以及systime()自Unix Epoch以来以秒为单位返回当前时间的函数,因此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
Run Code Online (Sandbox Code Playgroud)

第二个是正确的。我认为原因是英国从1968年到1971年一直实行夏令时。