Joda时间,周期计算问题



以下代码返回相同的结果,相差5年。应该是5Y、5Y1D和5Y2D吗?

val date1 = org.joda.time.LocalDate(2025,2,28) 
val date2 = org.joda.time.LocalDate(2019,11,28).plusMonths(3) 
val ddd = org.joda.time.Period(date2, date1)
println("${ddd.years} ${ddd.months} ${ddd.days}")
val date1 = org.joda.time.LocalDate(2025,2,28) 
val date2 = org.joda.time.LocalDate(2019,11,29).plusMonths(3) 
val ddd = org.joda.time.Period(date2, date1) 
println("${ddd.years} ${ddd.months} ${ddd.days}")
val date1 = org.joda.time.LocalDate(2025,2,28) 
val date2 = org.joda.time.LocalDate(2019,11,30).plusMonths(3) 
val ddd = org.joda.time.Period(date2, date1) 
println("${ddd.years} ${ddd.months} ${ddd.days}")

不,不应该。

首先,在2019年11月28日、29日或30日加上三个月,即为2020年2月28日,29日和29日(!(。2020年是闰年,所以二月有29天,而不是30天。接下来,从2020年2月29日到2025年2月28日的时间是什么?它并没有很好地定义。你可能会说它不到5年,也许是4年11个月30天?然而,Joda Time选择将其视为5年,因为两个日期都在月底。

我建议使用java.time以获得更准确的结果。

您可以将代码重构为:

fun main() {
var javaDate1 = java.time.LocalDate.of(2025,2,28)
var javaDate2 = java.time.LocalDate.of(2019,11,28).plusMonths(3)
var jd = java.time.Period.between(javaDate2, javaDate1)
println(
"Between ${javaDate2} and ${javaDate1} are ${jd.years} years, ${jd.months} months and ${jd.days} days")
javaDate1 = java.time.LocalDate.of(2025,2,28)
javaDate2 = java.time.LocalDate.of(2019,11,29).plusMonths(3)
jd = java.time.Period.between(javaDate2, javaDate1)
println(
"Between ${javaDate2} and ${javaDate1} are ${jd.years} years, ${jd.months} months and ${jd.days} days")
javaDate1 = java.time.LocalDate.of(2025,2,28)
javaDate2 = java.time.LocalDate.of(2019,11,30).plusMonths(3)
jd = java.time.Period.between(javaDate2, javaDate1)
println(
"Between ${javaDate2} and ${javaDate1} are ${jd.years} years, ${jd.months} months and ${jd.days} days")
}

运行它并得到以下结果:

Between 2020-02-28 and 2025-02-28 are 5 years, 0 months and 0 days
Between 2020-02-29 and 2025-02-28 are 4 years, 11 months and 30 days
Between 2020-02-29 and 2025-02-28 are 4 years, 11 months and 30 days

最新更新