joda期间返回0个月

时间:2017-02-22 16:14:52

标签: java scala datetime jodatime

我有2 joda.DateTime个,我用它来创建Duration。然后Duration会转换为Period,虽然这两个日期相隔3年,但Period.getDaysPeriod.getMonthsPeriod.getYears都会返回0。为什么?

来自Scala REPL的示例,但应该易于理解/转换为Java(我可以根据需要进行转换)

import org.joda.time.format.PeriodFormat
import org.joda.time.{DateTime, Period}
import org.joda.time.Duration
import org.joda.time.format.PeriodFormatterBuilder

scala> val start = DateTime.now
start: org.joda.time.DateTime = 2017-02-22T16:09:13.131Z

scala>     val end = start.plusYears(2).plusMinutes(1).plusDays(3)
end: org.joda.time.DateTime = 2019-02-25T16:10:13.131Z

scala>     val duration = new Duration(start, end)
duration: org.joda.time.Duration = PT63331260S

scala>     duration.getMillis
res0: Long = 63331260000

scala>     duration.getStandardDays
res1: Long = 733

scala>     duration.getStandardHours
res2: Long = 17592

scala>     duration.getStandardMinutes
res3: Long = 1055521

scala>     duration.getStandardSeconds
res4: Long = 63331260

scala>     val period = duration.toPeriod()
period: org.joda.time.Period = PT17592H1M

scala>     period.getDays
res5: Int = 0

scala>     period.getHours
res6: Int = 17592

scala>     period.getMinutes
res7: Int = 1

scala>     period.getSeconds
res8: Int = 0

scala>     period.getMillis
res9: Int = 0

scala> val formatter = new PeriodFormatterBuilder()
            .appendMonths().appendSuffix(" month", " months").appendSeparator(" ")
            .appendDays().appendSuffix(" day", " days").appendSeparator(" ")
            .appendHours().appendSuffix("h")
            .appendMinutes().appendSuffix("m")
            .appendSeconds().appendSuffix("s")
            .toFormatter
formatter: org.joda.time.format.PeriodFormatter = org.joda.time.format.PeriodFormatter@3096d00d

scala>     formatter.print(duration.toPeriod())
res10: String = 17592h1m

scala> PeriodFormat.getDefault.print(duration.toPeriod)
res11: String = 17592 hours and 1 minute

1 个答案:

答案 0 :(得分:3)

您正在致电AbstractDuration.toPeriod

  

使用标准句点类型和ISO年代表将此持续时间转换为Period实例。

     

仅使用句点类型中的精确字段。因此,仅使用该时段上的小时,分​​钟,秒和毫秒字段。不会填充年,月,周和日字段。

Duration没有"知道"它的起点和终点,所以你不能期望填充变量长度值,例如几个月。

要获得startend之间的时间段,您应该使用:

new Period(start, end)

...可能会PeriodType说出你想要的单位。