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
A
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
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? –
jq170727 réponse est mieux que je pourrais jamais inventer. :-) – wjtk