人类可读形式的时间戳

时间:2016-03-18 23:47:16

标签: linux macos datetime unix command-line

有没有办法管道包含一堆epoch / unix时间戳值的内容,并查看将datetime值转换为人类可读形式的文本,如:

$ cat data.txt
{
  "id": "20a68337-922b-4db0-85d6-719c97e0ee83",
  "published_at": 1457427709695,
  "expires": 1458346544
}

$ cat data.txt | convert-datetimes
{
  "id": "20a68337-922b-4db0-85d6-719c97e0ee83",
  "published_at": Tue, 08 Mar 2016 09:01:49.695 GMT,
  "expires": Wed, 18 May 2016 23:42:21 GMT
}

1 个答案:

答案 0 :(得分:4)

这基本上是一个定义不明确的问题,因为时间戳只是数字,任何数字都对应某些时间。因此,您必须为哪些值是合理的时间戳定义一些启发式方法。

一旦你有了这样的启发式,如果你不想保留输入的结构(在你的例子中是JSON),只需要采用你喜欢的文本替换语言并实现它。例如,我们可以假设任何具有正确位数(毫秒或秒)的数字都可以。

当然,正确的位数会随着时间的推移而变化,但直到2286年它才会增加,我希望这会很久就会过时。

的Python:

import re, sys, time

def reformat(match):
    timestamp = int(match.group(1))
    if timestamp >= 1e12:
        timestamp /= 1000.0
    return time.asctime(time.gmtime(timestamp))

for line in sys.stdin:
  sys.stdout.write(re.sub(r"\b(\d{10,14})\b", reformat, line))

Perl 5:

while (<>) {
  s/\b(\d{10,12})\b/gmtime $1/ge;
  s!\b(\d{13,14})\b!gmtime($1 / 1000)!ge;
  print;
}

改进:

  • 如果你知道你期望看到的时间戳,例如它们都在当前时间的某个范围内,那么你可以添加一个条件(在替换函数中),返回原始字符串未编辑如果数值超出范围。

  • 您可以收紧正则表达式以检查附近的字符,例如使用&#34; - &#34;在它之前。

  • 如果输入实际上是JSON或其他结构化语法,您实际上可以解析输入并仅查找您期望它们的时间戳(或者通常,就像不匹配任何字符串值内的数字一样)。