2016-12-23 45 views
1

我想計算一對DateTime是否的被四捨五入到最近的第二或分鐘之間的差別。回合Julia的毫秒類型到最接近秒或分

initial = now() 
println(typeof(initial)) 
sleep(12) 
final = now() 
difference = final - initial 
println(typeof(difference)) 

DateTime 
Base.Dates.Millisecond 

後一種類型是好看不好用,因爲幾乎所有的便利類型是DateTime秒。將difference轉換爲秒或小數分鐘的推薦方法是什麼?這可能沒有下降到整數?我寧願避免這種情況,因爲它更容易出錯。

+0

你想從毫秒轉換爲整數,如:'convert(Int64,difference)'?或者到'DateTime'? – Gomiero

+0

這是我的問題中的一個錯字。如果可能,我寧願避免使用整數。 – tlnagy

+0

我不確定,但我想你正在尋找'Dates.epochms2datetime(差異)'。 [Dates.epochms2datetime](http://docs.julialang.org/en/stable/stdlib/dates/?highlight=datetime#Dates.epochms2datetime)會將毫秒轉換爲'DateTime'類型(例如,在問題中,它會給大約'0000-01-01T00:00:21.608'),這樣你就可以轉換使用[存取函數]的結果(http://docs.julialang.org/en/stable/stdlib/dates/?highlight=日期時間#存取函數) – Gomiero

回答

3

由於difference代表日期,而不是一個特定的時間之間的時間,這是有道理的,它只是以毫秒爲單位。此外,DateTimeBase.Dates.Millisecond對象在內部與Int64表示,因此一切都已經是一個整數。

julia> moment = now() 
2016-12-22T22:54:57.393 

julia> dump(moment) 
DateTime 
    instant: Base.Dates.UTInstant{Base.Dates.Millisecond} 
    periods: Base.Dates.Millisecond 
     value: Int64 63618130497393 

julia> dump(now()-moment) 
Base.Dates.Millisecond 
    value: Int64 29820 

將該值以毫秒爲單位除以1000以獲得秒,或以60,000除以獲得分鐘。使用round()四捨五入到最接近的秒或分鐘。

julia> d = (now() - moment).value/60_000 
3.9330833333333333 

julia> e = round(d) 
4.0 

然後由1000或60000相乘並反饋到Dates.Millisecond打開圓形圖回相應的對象:

julia> Dates.Millisecond(60_000e) 
240000 milliseconds 

四捨五入一個DateDateTime對象到一個給定的時間間隔是多更簡單,因爲您可以根據documentation僅使用round(),並且它會派遣到相關方法:

julia> floor(Date(1985, 8, 16), Dates.Month) 
1985-08-01 

julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15)) 
2013-02-13T00:45:00 

julia> round(DateTime(2016, 8, 6, 20, 15), Dates.Day) 
2016-08-07T00:00:00