2015-09-24 21 views
1

奇怪的是,我對許多類似的帖子有反面問題;我試圖使用JodaTime(在Android上)給我一個dd:hh:mm:ss類型的輸出,並且失敗了。代碼是;JodaTime:打印期限爲天:小時:分:秒

public String GetEventTimeString(boolean withMS, int eventTime) 
{ 
    Period p = new Period(eventTime, PeriodType.yearMonthDayTime()); 
    if (withMS) 
     return _formatter_withms.print(p); 
    else return _formatter_withoutms.print(p); 

} 

當我使用調試器p設置後停止,我看到p本身具有的小時值設置爲568和天值爲零,所以我還沒有張貼創建格式化代碼。 eventTime是一個int值,表示經過時間,以ms爲單位,在這種情況下值爲2045489151。

如果數字大小有些奇怪,而且它是一個int而不是很長,我嘗試了一個new Period(1500000L, PeriodType.yearMonthDayTime())並得到了0天,25小時,0分鐘和秒的週期。

探索期間的iType成員的結構,我看到一個數組iTypes包含元素「年」,「月」等。我還看到一個數組iIndices似乎將類型映射到其他數組中的元素。大多數指標是合理的,但對應於「天數」的指數是-1。所以看起來PeriodType.yearMonthDayTime()沒有做我認爲文檔說它應該。

如果我嘗試PeriodType.yearWeekDayTime我會得到相同的結果。如果我嘗試PeriodType.yearWeekDay那麼三個字段爲零,具有我的25小時測試值。所以這不僅僅是一個PeriodType的行爲不當。

想知道從我的相當隨意(挑選一個數字並保持加零)到恰好25小時的巧合,我試了1510000,得到了25h 10m 0s。但是,當您手動進行轉換時,這兩者實際上都沒有任何意義!

這是在Android上,最新的Android Studio 1.3.2,不確定如何知道我使用的是哪個版本的JodaTime,但它是在過去的幾個月內,這似乎有點太明顯,是一個晦澀的bug - 我認爲更多的是誤解和深入挖掘的結合。

有沒有人對發生了什麼有什麼想法?

+0

簡短但完整的可編譯代碼會很好;-)。你如何構建「_formatter ...」?它是'PeriodFormatter'嗎? –

+0

好,正如我在文中所說的,我將問題確定爲在格式化程序之前,所以真的沒有意義。 –

+0

你說得對。在我寫完我的評論後,我終於明白,你的問題與格式不相關,但與期間的規範化有關。 –

回答

1

好,喬達時說,關於normalization of a millisecond-based period

創建從給定的時間毫秒的週期。僅使用期間類型中的精確 字段。不精確的字段將不會填入 。

這裏的問題出現了:日間單位是Joda-Time的精確領域嗎?不,因爲在許多國家/地區切換日光節約時間(實際上有23.5小時等更多可能性),每天可以有23或25小時。所以你調用的構造函數不會填充日單元字段。

如何獲得所需的標準化效果?只是這樣做推薦的方法(在建設期間沒有標準化):

long eventTime = 2045489151; 
Period p = new Period(eventTime, PeriodType.millis()); 
System.out.println(p); // PT2045489.151S (no normalization) 

System.out.println(p.normalizedStandard(PeriodType.dayTime())); 
// P23DT16H11M29.151S 
System.out.println(p.normalizedStandard(PeriodType.yearMonthDayTime())); 
// P23DT16H11M29.151S (the same result as one line before, not the best period type) 

這是辯論恕我直言,該Period -constructor,您使用做了部分正常化。在我看來,使用給定週期類型或完全沒有標準化的完全標準化(我首選的 - 只是毫秒爲millis,但第二個構造函數的參數簡直是愚蠢的)將是一個明智的設計決策。有趣的是(也令人困惑),沒有顯式週期類型參數的構造函數也進行了部分規範化。爲避免構造函數中過早的不完整規範化,必須明確指定句點類型爲PeriodType.millis()。對不起,您的困惑。

+0

可愛的完整答案 - 謝謝。 –

相關問題