Joda-time, Period计算问题?

问题描述 投票:0回答:1

下面的代码返回相同的结果,相差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}")
java kotlin jodatime
1个回答
2
投票

不,不应该。

首先,当在2019年11月28日、29日或30日的基础上加三个月时,你得到的是2020年2月28日、29日和29日(!)。2020年是闰年,所以2月有29天,不是30天。接下来,从2020年2月29日到2025年2月28日是什么时期?这其实不好界定。你可能会说,不到5年,也许是4年11个月30天?然而,Joda-Time选择将其视为5年,因为这两个日期都在月底。


1
投票

我建议使用 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
© www.soinside.com 2019 - 2024. All rights reserved.