将 Unix 时间戳转换为人类可读的时间

将 Unix 时间戳转换为人类可读的时间

我想使用 awk/grep 查看一个文本文件,其中第一列包含 Unix 时间戳。如何在查看时将其转换为人类可读的时间?

答案1

如果该行以 unix 时间戳开头,那么应该这样做:

perl -pe 's/^(\d+)/localtime $1/e' inputfilename

perl -p对传递的表达式调用循环-e,该循环针对输入的每一行执行,并在循环末尾打印缓冲区。

该表达式使用 substition 命令s///来匹配并捕获每行开头的数字序列,并将其替换为解释为 Unix 时间戳的这些数字的本地时间表示形式。/e指示替换模式将被评估为表达式。

答案2

如果你的 AWK 是呆呆, 您可以使用strftime

gawk '{ print strftime("%c", $1) }'

会将第一列中的时间戳转换为当前区域设置的默认日期/时间表示形式。

您可以在查看内容之前使用它来转换内容:

gawk '{ print gensub($1, strftime("%c", $1), 1) }' inputfile

答案3

使用“日期”

为此,您不需要 perl、awk、php 或长算术表达式。您可以使用 gnu“date” 来完成此操作,这对于此类事情确实非常有用。对于其他版本的“日期”,您的 YMMV.

$ date -d '1/1/1970 GMT 1571889039 seconds'
Wed Oct 23 20:50:39 PDT 2019

这里发生的事情是您指定一个时间并对其进行调整。时间是格林尼治标准时间 1970 年 1 月 1 日午夜,unix 纪元。 (午夜没有明确给出;每当您省略一天中的时间时,都会隐式使用它。)

将调整值 157188​​9039 秒添加到时间中。显然,请使用您的时间戳。文档使用“相对”一词来描述此功能。

有一个更简洁的版本,仅通过联机帮助页中的示例进行记录,适用于较新版本的 gnu date:

$ date -d @2147483647
Mon Jan 18 19:14:07 PST 2038

如果您需要经常操作日期,请了解您的日期命令。它不仅仅是一个时钟;它不仅仅是一个时钟。它是 shell 的日期/时间库。

答案4

对于便携式版本,在最坏的情况下你可以自己计算。 Unix 时间戳定义于POSIX XBD 自纪元以来 4.16 秒

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

这是您想要的映射的逆过程,因此需要做一些工作*才能反转它。这将使您得到分解的“POSIX UTC”,但是您可能需要一种方法来将其格式化为当前时区。它似乎date -d不可移植,所以我不清楚是否有任何好的方法可以做到这一点。

*好吧,这可能是轻描淡写的。

相关内容