我有一个JodaTime Period,我是从两个DateTime时刻创建的。有没有一种方法可以将该期间转换为十进制小时数?
例如,我的时间段为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);
这种感觉就像一个黑客,当我开始将Periods加在一起时更别提尴尬了。似乎应该有更好的方法。
有什么想法吗? 感谢
答案 0 :(得分:14)
如果你有两个DateTimes,我希望你们之间有一个Duration
而不是Period
...但除此之外和Mike的评论,看起来是正确的:< / p>
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);
答案 1 :(得分:3)
有点旧,但我最近看到了这个,你可以使用DateTimeFormatterBuilder
来做到这一点。它有一系列称为appendFraction...
的方法,它们会附加一小时,分钟,秒等等。
当您使用Period
时,这并不是您所要求的,但您可以通过在午夜制作新DateTime
来解决此问题。
此格式化程序应解析您的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);
答案 2 :(得分:1)
使用 Jon Skeet 示例,你有一个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);