如何在 cli 上将纪元时间戳转换为人类可读的格式?

如何在 cli 上将纪元时间戳转换为人类可读的格式?

如何在 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

相关内容