11

2 つの DateTime インスタントから作成した JodaTime 期間があります。その期間を 10 進数の時間数に変換する良い方法はありますか?

たとえば、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);

ピリオドを一緒に追加し始めると厄介なことは言うまでもなく、この種のハックのように感じます。もっと良い方法があるはずです。

何か案は?ありがとう

4

3 に答える 3

14

Duration2 つの DateTimes がある場合は、それらの間に ... ではなくa があることを期待しますが、それとPeriodMike のコメントを除けば、それは正しいようです:

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);

代わりにtoStandardSeconds().getSeconds()使用を避けることができることに注意してください。Duration.getMillis()

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);
于 2010-07-22T19:21:04.153 に答える
1

Jon Skeetの例を使用すると、 Non-terminating decimal expansion Exceptionfrom Division 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); 
于 2017-05-05T12:34:28.793 に答える