2017-09-18 2 views
1

時間がミリ秒単位であり、期間に合わせてフォーマットしたいと思います。例えば、次のようにします(このように必ずしも必要ではありません):1d 23h 15m 13s。 これはどのようにしてjqで行うことができますか?jqコンソールツールで時間枠をフォーマットします

+1

あなたはそれを自分で行う必要があります - ちょうどあなたが他の言語と同じように、分岐ロジックを独自の数学の+を書きます。そうしようとしましたか?試行した作業を表示できますか? –

+0

jq170727答えは私がこれまで発明したことができます。 :-) – wjtk

答えて

3

ここでは、計算を直接行うソリューションです。

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のみreleventフィールドが示されているより小さな間隔で

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

出力

17427d 16h 36m 20s 

ある場合。例えばここ

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

出力

25m 5s 
1

ない丸めと、凝縮「Dさh M S」の文字列ミリ秒を変換するための機能の簡潔かつ単純な実装です。ミリ秒の余りを含むようにこれを修正することは自明であろう。

# 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 
関連する問題