2016-09-22 6 views
3

Результат периода для следующих 2 случаев (начиная с 2016 года с 28 февраля по 2017 год 1 марта) являются одинаковыми друг с другом.Joda-Time: странное поведение для високосного года в расчете периода

Не могли бы вы помочь объяснить это странное поведение?

Случай 1: 2016 28 февраля 2017 Mar 1

Calendar start1 = Calendar.getInstance(); 
start1.set(2016, Calendar.FEBRUARY, 28, 0, 0, 0); 
Calendar end1 = Calendar.getInstance(); 
end1.set(2017, Calendar.MARCH, 1, 0, 0, 0); 
Interval i1 = new Interval(new DateTime(start1.getTime()), new DateTime(end1.getTime())) 
System.out.println(i1.toPeriod()); 

результат: P1Y1D


Случай 2: 2016 29 февраля 2017 Mar 1

Calendar start2 = Calendar.getInstance(); 
start2.set(2016, Calendar.FEBRUARY, 29, 0, 0, 0); 
Calendar end2 = Calendar.getInstance(); 
end2.set(2017, Calendar.MARCH, 1, 0, 0, 0); 
Interval i2 = new Interval(new DateTime(start2.getTime()), new DateTime(end2.getTime())) 
System.out.println(i2.toPeriod()); 

результат: P1Y1D

+3

Что такое '2016-02-28' плюс 1 год? '2017-02-28'. --- Что такое '2016-02-29' плюс 1 год? '2017-02-28'. --- ** Тот же ответ **, так: Что такое '2017-02-28' плюс 1 день? '2017-03-01'. --- См. Javadoc ['DateTime.plus (период ReadablePeriod)'] (http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html#plus (org.joda.time. ReadablePeriod)). – Andreas

+0

Возможный дубликат: [Does org.joda.time.Period уважают високосные годы?] (Http://stackoverflow.com/questions/34769873/does-org-joda-time-period-respect-leap-years) –

ответ

1

Рассмотрим

public static void main(String[] args) throws Exception 
{ 
    LocalDate start1 = LocalDate.of(2016, Month.FEBRUARY, 28); 
    LocalDate start2 = LocalDate.of(2016, Month.FEBRUARY, 29); 
    LocalDate end = LocalDate.of(2017, Month.MARCH,  1); 
    Period year = Period.ofYears(1); 

    System.out.println(start1); 
    System.out.println(start2); 
    System.out.println(end); 
    System.out.println(start1.plus(year)); 
    System.out.println(start2.plus(year)); 
    System.out.println(start1.until(end)); 
    System.out.println(start2.until(end)); 
} 

Выход

2016-02-28 
2016-02-29 
2017-03-01 
2017-02-28 
2017-02-28 
P1Y1D 
P1Y1D 

Это не может быть, как вы хотели бы, чтобы он работал, но мне кажется, что реализация последовательны.

Что именно означает добавить 1 год до 29 февраля? Его можно также принять за «Последний день в феврале» или дату начала плюс 365 дней. Последнее определение вызывает проблему в течение нескольких дней до 29 февраля високосного года:

February 1 2016 + 1 year == January 31 2017 
February 1 2017 + 1 year == February 1 2018 

, который смутит людей.

Это особенность нашего календаря, и существующее поведение, похоже, сводит к минимуму (но не устраняет) даты, когда поведение «удивительно».