Time 使用jq控制台工具格式化时间段

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

我有以毫秒为单位的时间,我想将其格式化为时间段。例如,像这样(不必完全像这样):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 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答案比我发明的更好。:-)