2017-11-10 18 views

答えて

2

あなたがあなた自身の関数を作ることができます。主な機能はdivremです。便利な関数呼び出しでは除数と剰余を得ることができます。

dt=3600.125 

function hmss(dt) 
    (h,r) = divrem(dt,60*60) 
    (m,r) = divrem(r, 60) 
    #(s,r) = divrem(r, 60) 
    string(Int(h),":",Int(m),":",r) 
end 

hmss(dt) 

hmss(3452.98) 
+0

JuliaのDateTimeサポートがそれほど優れている場合、なぜそれをしますか? –

+0

何がより重要か教えているからです。 ppl私の方法leanrネイティブdatetimeに移動することができますが、他の周りは難しいです – xiaodai

+1

また、この場合のDateTimeの使用は煩雑です。いくつかの関数の呼び出し、書式設定、いくつかのトリックが必要です。例えば、リソの答えは、例えば以下の通りです。 xiaodaiのソリューションは短くてシンプルです。 –

2

dates section in the manualをご覧ください。

ない、これが最も効率的な方法であるが、これは、例えば動作するかどうかを確認します。

julia> Dates.format(DateTime("2017-10-01T01:02:03"), "H:M:S.s") 
"1:2:3.0" 
+0

はい! JuliaのDateTime操作に強力な組み込み機能を使用することを強くお勧めします。 –

+1

@ MichaelK.Borregaardあなたは私の答えを見て、おそらく "埋め込まれた施設"をうまく利用できますか?私の視点から見ると、まだJuliaでは少し複雑です。例えば、私は 'Dates.format(Dates.Nanosecond(1e8)、dateformat" S.s ")'が動作していると期待しています。 – Liso

+0

このaswerは、3600 * 24秒未満の期間の問題を解決します。しかし、偽の日付が必要です。 –

1

日付形式に変換すると、this methodを使用できます。

julia> t1 = now() 
2017-11-10T10:00:51.974 
# Wait 
julia> t2 = now() 
2017-11-10T10:10:07.895 
julia> x = Dates.canonicalize(Dates.CompoundPeriod(t2-t1)) 
9 minutes, 15 seconds, 921 milliseconds 

julia> x.periods 
3-element Array{Base.Dates.Period,1}: 
9 minutes  
15 seconds  
921 milliseconds 

julia> x.periods[2] 
15 seconds 

julia> x.periods[2].value 
18 
0
""" working properly only if 0<= sec <=86400 otherwise truncating """ 
function fmtsec(sec, fmt::Dates.DateFormat) 
    # nanos = Dates.Nanosecond(sec * 1e9) # we could get InexactError here! 
    nanos = Dates.Nanosecond(trunc(Int, sec * 1e9)) 
    mytime = Dates.Time(nanos) 
    Dates.format(mytime, fmt) 
end 

fmt = dateformat"H:M:S.s" # Creating a DateFormat object is expensive. (see doc) 

fmtsec(3600.125, fmt) # "1:0:0.125" 

EDIT:ナノ秒を切り捨てず、我々はエラー得ることができる - >

julia> tic();sleep(1);old_fmtsec(toc(), dateformat"S.s") 
elapsed time: 1.002896514 seconds 
ERROR: InexactError() 
Stacktrace: 
[1] convert(::Type{Int64}, ::Float64) at ./float.jl:679 
[2] fmtsec(::Float64, ::DateFormat{Symbol("S.s"),Tuple{Base.Dates.DatePart{'S'},Base.Dates.Delim{Char,1},Base.Dates.DatePart{'s'}}}) at ./REPL[47]:2 

julia> tic();sleep(1);old_fmtsec(toc(), dateformat"S.s") 
elapsed time: 1.002857122 seconds 
"1.002" 

tic & tocは推奨されません。 tocは、内部的にtime_nsを使用するため、丸め誤差を発生させる可能性がありますが、ナノ秒は1e9で秒に変換されます。

関連する問題