从Unix时间在命令行转换

有没有一种快速的,单行的方法来将Unix时间戳转换为Unix命令行中的date?

'date'可能工作,除非指定每个元素(月,日,年,小时等)相当尴尬,我不知道如何让它正常工作。 似乎可能有一个更简单的方法 – 我错过了什么?

有了GNU的date你可以做:

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

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

在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 

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

该解决scheme适用于不支持date -d @的date版本。 它不需要AWK或其他命令。 Unix时间戳是UTC自1970年1月1日以来的秒数,因此指定UTC很重要。

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

如果您在Mac上,请使用:

 date -r 1357004952 

获取时代的命令:

 date +%s 1357004952 

Credit转到Anton: BASH:将Unix时间戳转换为date

正如@TomMcKenzie在对另一个答案的评论中所说的, date -r 123456789可以说是自从Unix Epoch以来以秒为单位给出的一个更常见(即更广泛实现)的简单解决scheme,但不幸的是没有通用保证的便携式解决scheme。

许多types的系统上的-d选项意味着与GNU Date的--date扩展完全不同的--date 。 令人遗憾的是,GNU Date并不像其他实现那样解释-r 。 所以不幸的是,你必须知道你使用的是哪个版本的date ,许多旧的Unix date命令不支持这两个选项。

更糟糕的是,POSIX date既不识别-d也不识别任何命令,也没有提供任何命令(我知道)从命令行格式化Unix时间(因为POSIX Awk也缺lessstrftime() )。 (你不能使用touch -tls因为前者不接受从Unix Epoch开始的秒数。)

请注意,尽pipe直接从Brian Kernighan提供的One True Awk现在有内置的strftime()函数以及一个systime()函数,以便在Unix Epoch以后以秒为单位返回当前时间),所以Awk解决scheme可能是最便携的。

如果你发现这个符号很尴尬,也许-R确实有帮助。 它以RFC 2822格式输出date。 所以你不需要所有的标识符: date -d @1278999698 -R 。 另一种可能是在您的语言环境中以秒为单位输出date: date -d @1278999698 +%c 。 应该很容易记住。 🙂

这里的其他例子很难记住。 最简单的:

 date -r 1305712800 

标准的Perl解决scheme是:

 echo $TIMESTAMP | perl -nE 'say scalar gmtime $_' 

(或当地时间,如果优选的话)

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

稍微修改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年持续生效。