2017-09-18 1 views
1

Ich habe Zeit in Millisekunden und ich möchte es auf Zeitperiode formatieren. Zum Beispiel so (nicht unbedingt genau so): 1d 23h 15m 13s. Wie kann es mit jq getan werden?Format Zeitraum mit jq Konsolen-Tool

+1

Sie müssen es selbst tun - Ihre eigene Mathematik schreiben + Verzweigungslogik, so wie man es in einer anderen Sprache. Haben Sie sich darum bemüht? Können Sie Ihre versuchte Arbeit zeigen? –

+0

jq170727 Antwort ist besser, dass ich jemals erfinden könnte. :-) – wjtk

Antwort

3

Hier ist eine Lösung, die die Berechnungen direkt ausführt.

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) 

Wenn diese Filter sind in filter.jq dann

$ jq -Mnr --argjson ms 1505752580000 -f filter.jq 

Ausgänge

17427d 16h 36m 20s 

kleinere Abstände nur die relevanten Felder angezeigt werden. z.B.

$ jq -Mnr --argjson ms 1505750 -f filter.jq 

Ausgänge

25m 5s 
1

Hier ist eine kurze, aber einfache Implementierung einer Funktion zur Millisekunden eines kondensierten "d h m s" string, ohne Rundung überführt. Es wäre trivial, dies so zu modifizieren, dass auch der Rest in Millisekunden enthalten wäre.

# 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 

Beispiel:

$ jq -r -f formattime.jq 
1505752580000 
17427d 16h 36m 20s 
6006 
6s 
1 
0s