如何在 jq 中将秒表示为持续时间

问题描述 投票:0回答:1

我想以某种人类可读的形式显示与一毛钱持续时间相对应的秒数,而不是常规日期。说某事,例如:

[
  30300,
  120300,
  296700,
  31922700,
  63458700
]

以及我想要得到什么

[
  "0d, 08:25",
  "1d, 09:25",
  "3d, 10:25",
  "1y 4d, 11:25",
  "2y 4d, 11:25"
]

似乎没有“简单”(内置)的方法来实现这一点。找到了一些几乎可以满足我需要的库:

https://github.com/fearphage/jq-duration

但它有固定的输出格式,不太符合我的需求。

我能够通过

strftime
实现我想要的,基本上这就是“几乎是约会”,对吧?我可以获得小时和分钟,我可以获得“一年中的第几天”(
&j
),我可以获得年份(
%Y
)。但有一些注意事项:默认年份从 1970 年开始,根据文档:一年中的日期是 1-366。

如果我从“年”中减去 1970 以获得从 0 开始的年数,并对“天”做同样的事情(减一)会怎样?

所以我们最终会得到下面的 jq 过滤器:

gmtime | (.[0] -= 1970) | (.[7] -= 1) | strftime ("%Yy %jd, %H:%M") | ltrimstr("0y ") | sub("0+(?<ds>[0-9]+d)";"\(.ds)")

剩下的唯一事情就是修剪多余的零(

%j
产生固定宽度(3个字符))

有点hacky,但完成了工作 - 你觉得怎么样?

https://jqplay.org/s/JGUUnI8q1zK

也许 sbd 有更好的方法来解决这个问题?

btw - 我还检查了更大的值(超过 4 年),似乎“我的方式”返回与 javascript

moment.js
+ https://github.com/jsmreese/moment-duration-format lib 相同

https://jqplay.org/s/Z1GJXHpegz9

json jq duration
1个回答
0
投票

这是一种不涉及使用内置时间函数的方法:

map(
    [foreach (
        [60, "seconds"],
        [60, "minutes"],
        [24, "hours"],
        [365, "days"],
        [false, "years"]
    ) as [$unit, $key] (
        {in: .};
        if $unit then
            {in: (.in/$unit | floor), out: {($key): (.in%$unit)}}
        else
            {out: {($key): .in}}
        end;
        .out
    )] | add | [
        (.years | if . > 0 then "\(.)y" else empty end),
        "\(.days)d,",
        ([.hours, .minutes] | map(if . < 10 then "0\(.)" else . end) | join(":"))
    ] | join(" ")
)

在线演示

© www.soinside.com 2019 - 2024. All rights reserved.