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

wjt*_*jtk 3 time jq

我的时间以毫秒为单位,我想将其格式化为时间段。例如这样(不必完全像这样):1d 23h 15m 13s。用jq怎么办呢?

jq1*_*727 5

这是一个直接进行计算的解决方案。

 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)
Run Code Online (Sandbox Code Playgroud)

如果这个过滤器在filter.jq的话

$ jq -Mnr --argjson ms 1505752580000 -f filter.jq
Run Code Online (Sandbox Code Playgroud)

输出

17427d 16h 36m 20s
Run Code Online (Sandbox Code Playgroud)

对于较小的间隔,仅显示相关字段。例如

$ jq -Mnr --argjson ms 1505750 -f filter.jq
Run Code Online (Sandbox Code Playgroud)

输出

25m 5s
Run Code Online (Sandbox Code Playgroud)