2010-07-22 38 views
11

我有一個從兩個DateTime實例創建的JodaTime週期。將該期間轉換爲十進制小時數有什麼好方法嗎?任何將JodaTime期間轉換爲十進制小時數的方法?

例如,我有一個時間段,從2010年1月1日下午1點到下午1點30分。我怎樣才能將該時間段設置爲1.5小時。

在過去,我已經使用手動秒BigDecimals的轉換像這樣:

int seconds = myPeriod.toStandardSeconds().getSeconds(); 
BigDecimal d = new BigDecimal((double) seconds/3600); 
// Round to two decimals 
BigDecimal correctResult = d.setScale(2, RoundingMode.HALF_DOWN); 

這有點像一個黑客攻擊的感覺,更不用說尷尬,當我開始添加時期在一起。似乎應該有更好的方法。

任何想法? 感謝

+1

你應該避免「雙倍」。您的一般方法是正確的,只需先在BigDecimal中獲取秒數,然後再將其除以BigDecimal.valueOf(3600),而不是通過雙重播放。在這種情況下,如果有任何區別,它可能沒有多大作用,但這是很好的做法。 – 2010-07-22 19:11:53

回答

14

如果你有兩個日期時間,我希望你有它們之間的Duration而非Period ......但除此之外,和邁克的意見,那看起來是正確的:

private static final BigDecimal SECONDS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.SECONDS_PER_HOUR); 
... 
DateTime dt1 = ...; 
DateTime dt2 = ...; 
Duration duration = new Duration(dt1, dt2); 
BigDecimal result = BigDecimal.valueOf(duration.toStandardSeconds().getSeconds()) 
           .divide(SECONDS_PER_HOUR) 
           .setScale(2, RoundingMode.HALF_DOWN); 

注意,您可以使用Duration.getMillis()而不是避免toStandardSeconds().getSeconds()

private static final BigDecimal MILLIS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR); 
... 
DateTime dt1 = ...; 
DateTime dt2 = ...; 
Duration duration = new Duration(dt1, dt2); 
BigDecimal result = BigDecimal.valueOf(duration.getMillis()) 
           .divide(MILLIS_PER_HOUR) 
           .setScale(2, RoundingMode.HALF_DOWN); 
2

有點老,但最近我一直在尋找這個,你可以使用DateTimeFormatterBuilder做到這一點。它有一系列稱爲appendFraction...的方法,它將追加小時,分鐘,秒等幾分之一。

這不完全是你問的,因爲你使用的是Period,但你可以通過創建一個新的DateTime在午夜。

此格式應解析您的日期時間:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .appendHourOfDay(1) 
    .appendLiteral(".") 
    .appendFractionOfHour(1, 2).toFormatter(); 

然後,您可以做這樣的事情來轉換期:

DateMidnight midnight = new DateTime("2012-12-13T21:39:45.618").toDateMidnight(); 
    LocalTime localTime = new LocalTime(midnight); 
    localTime.plus(period); 
    formatter.print(localTime); 
0

使用喬恩斯基特例如,你有從Non-terminating decimal expansion Exception除以BigDecimal divide(MILLIS_PER_HOUR),修復錯誤修改代碼爲:

private static final BigDecimal MILLIS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR); 




    DateTime t = new DateTime(); 
    DateTime t1 = new DateTime(); 
    DateTime dt1 = t; 
    DateTime dt2 = t1.plusMinutes(46); 
    Duration duration = new Duration(dt1, dt2); 
    BigDecimal result = BigDecimal.valueOf(duration.getMillis()) 
          .divide(MILLIS_PER_HOUR, 2, RoundingMode.CEILING) // <--- Add scale and RoundingMode.CEILING 
          .setScale(2); 
相關問題