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

xen*_*ide 249 command-line shell date

如何在 cli 上将纪元时间戳转换为人类可读的格式?我认为有一种方法可以用日期来做到这一点,但语法让我望而却步(欢迎其他方式)。

Gil*_*il' 371

在 *BSD 上:

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

在 Linux 上(特别是使用 GNU coreutils ?5.3):

date -d @1234567890
Run Code Online (Sandbox Code Playgroud)

使用旧版本的 GNU 日期,您可以计算与 UTC 纪元的相对差异:

date -d '1970-01-01 UTC + 1234567890 seconds'
Run Code Online (Sandbox Code Playgroud)

如果您需要便携性,那您就不走运了。您可以使用 POSIX shell 命令(无需自己计算)行格式化的唯一时间是当前时间。在实践中,Perl 经常可用:

perl -le 'print scalar localtime $ARGV[0]' 1234567890
Run Code Online (Sandbox Code Playgroud)

  • @ChrisMarkle GNU 手册页通常非常不完整。“日期字符串格式比这里容易记录的更复杂,但在信息文档中进行了完整描述。” 即:http://www.gnu.org/software/coreutils/manual/html_node/Seconds-since-the-Epoch.html#Seconds-since-the-Epoch (12认同)
  • +1 关于缺乏可移植性的评论(为什么 POSIX 规范不包含这样做的方法?gr) (5认同)
  • `date -d @1234567890` 中的 `@` 是什么意思?`man date`没有提到那个...... (4认同)
  • `info date` 已经很完整了。`28.9 Seconds since the Epoch` 中的条目详细解释了@timestamp。 (3认同)

fsc*_*itt 30

date -d @1190000000 用你的时代替换 1190000000

  • 假设 GNU 日期,那就是。 (8认同)

小智 25

如果您的纪元时间以毫秒而不是秒为单位,请在将其传递给之前删除最后三位数字date -d

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect
Run Code Online (Sandbox Code Playgroud)

这给出了不正确的数据。去掉最后三位数字。

$ 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.
Run Code Online (Sandbox Code Playgroud)


Iva*_*hau 15

使用 GNU 自定义格式date

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Run Code Online (Sandbox Code Playgroud)

或者使用 GNU awk

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Run Code Online (Sandbox Code Playgroud)

链接的 SO 问题:https : //stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

  • 仅适用于 GNU date 和 GNU awk。awk 和 nawk 都不支持 strftime。 (4认同)

Sté*_*las 15

bash-4.2或以上:

printf '%(%F %T)T\n' 1234567890
Run Code Online (Sandbox Code Playgroud)

(其中,%F %T是在strftime()型格式)

该语法的灵感来自ksh93.

ksh93然而,参数取为其中各种并且几乎不记录格式支持日期表达式。

对于 Unix 纪元时间,语法ksh93是:

printf '%(%F %T)T\n' '#1234567890'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 14

$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007
Run Code Online (Sandbox Code Playgroud)

这对于那些在日志文件中使用纪元时间的应用程序会派上用场:

$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)
Run Code Online (Sandbox Code Playgroud)


小智 9

我经常使用的两个是:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
Run Code Online (Sandbox Code Playgroud)

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
Run Code Online (Sandbox Code Playgroud)


don*_*sti 7

有了zsh您可以使用strftime内置的:

strftime格式纪元时间
以指定的格式
      输出由epochtime表示的日期。

例如

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Run Code Online (Sandbox Code Playgroud)
2009 年 2 月 13 日,星期五

还有dateconv来自dateutils

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Run Code Online (Sandbox Code Playgroud)
2009 年 2 月 13 日,星期五

请记住dateutils工具默认为UTC-z your/timezone如果需要添加)。