如何在 cli 上将纪元时间戳转换为人类可读的格式?我认为有一种方法可以用日期来做到这一点,但语法让我困惑(欢迎其他方式)。
答案1
在 *BSD 上:
date -r 1234567890
在 Linux 上(特别是 GNU coreutils ≥5.3):
date -d @1234567890
使用旧版本的 GNU 日期,您可以计算与 UTC 纪元的相对差异:
date -d '1970-01-01 UTC + 1234567890 seconds'
如果您需要便携性,那么您就不走运了。您可以使用 POSIX shell 命令(无需自己进行计算)行进行格式化的唯一时间是当前时间。在实践中,Perl 经常可用:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
答案2
如果您的纪元时间以毫秒而不是秒为单位,请在最后三位数字之前加一个点(如 user79743 的评论中所暗示的),或者在将其传递给之前删除最后三位数字date -d
:
直接输入,这会给出错误的结果:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
在最后三位数字前加一个点:
$ date -d @1455086371.603
Tue Feb 9 22:39:32 PST 2016 #Correct
或者,删除最后三位数字:
$ date -d @1455086371
Tue Feb 9 22:39:31 PST 2016 #Correct after removing the last three digits. You may remove and round off the last digit too.
答案3
date -d @1190000000
将 1190000000 替换为您的纪元
答案4
具有bash-4.2
或以上:
$ printf '%(%FT%T%z)T\n' 1234567890
2009-02-13T23:31:30+0000
(其中%FT%T%z
-typestrftime()
格式,此处使用标准明确格式,其中包括 UTC 偏移量 ( %z
))
该语法的灵感来自ksh93
.
然而ksh93
,参数被视为日期表达式,其中支持各种且几乎没有记录的格式。
对于 Unix 纪元时间,语法ksh93
为:
printf '%(%FT%T%z)T\n' '#1234567890'
ksh93
然而似乎使用自己的时区算法并且可能会出错。例如,在英国大陆,1970 年全年都是夏季,但是:
$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan 1 00:00:00 1970
ksh93(和zsh 的strftime
内置) 支持亚秒级,但尚不支持 bash:
$ ksh -c 'printf "%(%FT%T.%6N%z)T\n" 1234567890.123456789'
2009-02-13T23:31:30.123456-0000
$ zsh -c 'zmodload zsh/datetime; strftime %FT%T.%6.%z 1234567890 123456780'
2009-02-13T23:31:30.123457+0000