从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 -t
和ls
因为前者不接受从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年持续生效。