2017-09-18 4 views
1

J'ai le temps en millisecondes et je veux le formater en période. Par exemple comme ceci (pas nécessaire exactement comme ceci): 1d 23h 15m 13s. Comment cela peut-il être fait avec jq?format période avec l'outil de console jq

+1

Vous aurez besoin de le faire vous-même - écrire votre propre mathématiques + logique de branchement, comme vous le feriez dans une autre langue. Avez-vous fait des efforts pour le faire? Pourriez-vous montrer votre tentative de travail? –

+0

jq170727 réponse est mieux que je pourrais jamais inventer. :-) – wjtk

Répondre

3

Voici une solution qui effectue directement les calculs.

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) 

Si ce filtre est filter.jq puis

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

sorties

17427d 16h 36m 20s 

pour des intervalles plus petits que les champs de relevent sont présentés. par exemple.

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

sorties

25m 5s 
1

Voici une implémentation concise mais simple d'une fonction pour convertir millisecondes à la chaîne condensée « d h m de », sans arrondi. Il serait trivial de modifier cela pour inclure également le reste de la milliseconde.

# 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 

Exemple:

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