Joda-time, период расчета проблемы? - PullRequest
0 голосов
/ 05 мая 2020

приведенные ниже коды возвращают тот же результат с разницей в 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}")

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Нет, не должно.

Во-первых, при добавлении трех месяцев к 28, 29 или 30 ноября 2019 года вы получите 28, 29 и 29 (!) Февраля 2020 года. 2020 год - високосный год Итак, в феврале 29 дней, а не 30. Далее, какой период с 29 февраля 2020 года по 28 февраля 2025 года? Это не совсем точно определено. Вы можете возразить, что это меньше 5 лет, возможно, 4 года 11 месяцев 30 дней? Тем не менее, Joda-Time решила рассматривать его как 5 лет, поскольку обе даты находятся в конце месяца.

1 голос
/ 05 мая 2020

Я рекомендую использовать 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
...