Time 使用jq控制台工具格式化时间段
我有以毫秒为单位的时间,我想将其格式化为时间段。例如,像这样(不必完全像这样):1d 23h 15m 13s。Time 使用jq控制台工具格式化时间段,time,jq,Time,Jq,我有以毫秒为单位的时间,我想将其格式化为时间段。例如,像这样(不必完全像这样):1d 23h 15m 13s。 用jq怎么做 这里有一个直接进行计算的解决方案 def roundto(n): (./n|floor)*n ; def timefmt(ms): def calcsecs: .s_to_m = (.seconds | roundto(60)) | .secs = .seconds - .s_to_m ; def
用jq怎么做 这里有一个直接进行计算的解决方案
def roundto(n): (./n|floor)*n ;
def timefmt(ms):
def calcsecs: .s_to_m = (.seconds | roundto(60)) | .secs = .seconds - .s_to_m ;
def calcmins: .minutes = .s_to_m/60 | .m_to_h = (.minutes | roundto(60)) | .mins = .minutes - .m_to_h ;
def calchrs: .hours = .m_to_h/60 | .h_to_d = (.hours | roundto(24)) | .hrs = .hours - .h_to_d ;
def calcdays: .days = .h_to_d/24 ;
def fmtelt(e;u): if e>0 then " \(e)\(u)" else "" end ;
def fmt:
.s = " \(.secs)s"
| .m = fmtelt(.mins; "m")
| .h = fmtelt(.hrs; "h")
| .d = fmtelt(.days; "d")
| "\(.d)\(.h)\(.m)\(.s)"[1:]
;
{seconds: (ms/1000)|floor} | calcsecs | calcmins | calchrs | calcdays | fmt
;
timefmt($ms)
如果此筛选器位于filter.jq
中,则
$ jq -Mnr --argjson ms 1505752580000 -f filter.jq
输出
17427d 16h 36m 20s
25m 5s
对于较小的间隔,仅显示相关字段。e、 g
$ jq -Mnr --argjson ms 1505750 -f filter.jq
输出
17427d 16h 36m 20s
25m 5s
这是一个直接进行计算的解决方案
def roundto(n): (./n|floor)*n ;
def timefmt(ms):
def calcsecs: .s_to_m = (.seconds | roundto(60)) | .secs = .seconds - .s_to_m ;
def calcmins: .minutes = .s_to_m/60 | .m_to_h = (.minutes | roundto(60)) | .mins = .minutes - .m_to_h ;
def calchrs: .hours = .m_to_h/60 | .h_to_d = (.hours | roundto(24)) | .hrs = .hours - .h_to_d ;
def calcdays: .days = .h_to_d/24 ;
def fmtelt(e;u): if e>0 then " \(e)\(u)" else "" end ;
def fmt:
.s = " \(.secs)s"
| .m = fmtelt(.mins; "m")
| .h = fmtelt(.hrs; "h")
| .d = fmtelt(.days; "d")
| "\(.d)\(.h)\(.m)\(.s)"[1:]
;
{seconds: (ms/1000)|floor} | calcsecs | calcmins | calchrs | calcdays | fmt
;
timefmt($ms)
如果此筛选器位于filter.jq
中,则
$ jq -Mnr --argjson ms 1505752580000 -f filter.jq
输出
17427d 16h 36m 20s
25m 5s
对于较小的间隔,仅显示相关字段。e、 g
$ jq -Mnr --argjson ms 1505750 -f filter.jq
输出
17427d 16h 36m 20s
25m 5s
下面是一个简洁而直接的函数实现,用于将毫秒转换为压缩的“dhms”字符串,无需舍入。修改它以包括毫秒余数也是很简单的
# input: milliseconds
# output: ignore millisecond remainder
def formattime:
def f(u): if .>0 then " \(.)" + u else "" end ;
# emit a stream of the remainders
def s: foreach (1000,60,60,24,1) as $i ([.,0];
.[0] as $n
| ($n/$i | floor) as $m
| [$m, $n - ($m*$i)];
if $i == 1 then .[0] else .[1] end);
[s] as [$ms, $s, $m, $h, $d]
| {s : " \($s)s",
m : ($m|f("m")),
h : ($h|f("h")),
d : ($d|f("d")) }
| "\(.d)\(.h)\(.m)\(.s)"[1:]
;
formattime
示例:
$ jq -r -f formattime.jq
1505752580000
17427d 16h 36m 20s
6006
6s
1
0s
下面是一个简洁而直接的函数实现,用于将毫秒转换为压缩的“dhms”字符串,无需舍入。修改它以包括毫秒余数也是很简单的
# input: milliseconds
# output: ignore millisecond remainder
def formattime:
def f(u): if .>0 then " \(.)" + u else "" end ;
# emit a stream of the remainders
def s: foreach (1000,60,60,24,1) as $i ([.,0];
.[0] as $n
| ($n/$i | floor) as $m
| [$m, $n - ($m*$i)];
if $i == 1 then .[0] else .[1] end);
[s] as [$ms, $s, $m, $h, $d]
| {s : " \($s)s",
m : ($m|f("m")),
h : ($h|f("h")),
d : ($d|f("d")) }
| "\(.d)\(.h)\(.m)\(.s)"[1:]
;
formattime
示例:
$ jq -r -f formattime.jq
1505752580000
17427d 16h 36m 20s
6006
6s
1
0s
你需要自己动手——编写你自己的数学+分支逻辑,就像用其他语言一样。你做过什么努力吗?你能展示一下你的尝试吗?jq170727答案比我发明的更好。:-)你需要自己动手——编写你自己的数学+分支逻辑,就像用其他语言一样。你做过什么努力吗?你能展示一下你的尝试吗?jq170727答案比我发明的更好。:-)