我想以某种人类可读的形式显示与一毛钱持续时间相对应的秒数,而不是常规日期。说某事,例如:
[
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 相同
这是一种不涉及使用内置时间函数的方法:
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(" ")
)