Проблемы Joda-Time Period в некоторых случаях

Я использовал Joda-Time joda-time-2.3. jar для расчета дня с помощью приложения для Android. Мой код…

Period Nextperiod = new Period(ddate, nextdt,PeriodType.yearMonthDay());

В этом ddate и nextdt есть DateTime, обе даты являются типом ввода, который имеет формат SimpleDateFormat. Для разницы дней я использовал Nextperiod. getDays() Теперь тестовый пример:

Case 1 Right
ddate=2014-06-01T00:00:00.000+05:30
nextdt =2015-04-11T00:00:00.000+05:30
Day: 10
Month: 10
year: 0

Case 2 Wrong ddate= 2014-05-28T00:00:00.000+05:30 nextdt=2015-03-12T00:00:00.000+05:30 Day: 12 Month: 9 year: 0

В случае 2 должно быть 14, а когда я вставляю 29 мая или 30 мая, дней будет 12, тот же результат. Я не знаю, что не так с этой датой. Я проверил еще несколько дат, и результат соответствует моим ожиданиям. Сообщите мне о моей ошибке.
Также пробовал,
Period Nextperiod = new Period(new LocalDate(Ddate), new LocalDate(Ddate),PeriodType.yearMonthDay());
Заранее спасибо.


person Bhavin Chauhan    schedule 06.06.2014    source источник
comment
К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, где команда рекомендует перейти на java.time. См. учебник Oracle.   -  person Basil Bourque    schedule 02.02.2018


Ответы (2)


Вы можете понять, почему пример случая 2 верен, если попытаетесь шаг за шагом добавить 9 месяцев и 12 дней к дате начала (ddate).

Добавление 9 месяцев к 2014-05-28 приводит к 2015-02-28. Это последний день февраля 2015 года, поэтому добавление 12 дней дает 2015-03-12.

Это также относится к тестам с датой начала 29 мая или 30 мая: Период между этими датами и датой окончания составляет 9 месяцев и 12 дней.

person Modus Tollens    schedule 06.06.2014

tl;dr

java.time.Period.between( startLocalDate , stopLocalDate )

Java.время

принятый ответ от Modus Tollens верен.

К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, при этом команда рекомендует перейти на java.time. См. учебник Oracle.

Вот современная версия вашего кода.

Анализ ваших заданных строк как OffsetDateTime, поскольку они включают смещение от UTC, но не полный часовой пояс.

OffsetDateTime start = OffsetDateTime.parse( "2014-05-28T00:00:00.000+05:30" ) ;

Лучше использовать часовой пояс, чем смещение, если оно известно.

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime start = LocalDate.parse( "2014-05-28" ).atStartOfDay( z ) ;

Если вы действительно хотите работать только с датой, а не с датой и временем, используйте класс LocalDate.

LocalDate start = LocalDate.parse( "2014-05-28" ) ;

Вы можете извлечь только дату LocalDate из OffsetDateTime или ZonedDateTime, вызвав toLocalDate.

Представьте промежуток времени, который вы хотите перепрыгнуть, используя Period класс.

Period p = Period.ofMonths( 9 ).plus( Period.ofDays( 12 ) ) ;

Убедитесь, что значение, сгенерировав строку, соответствует стандартному формату ISO 8601.

String pOutput = p.toString() ;

P9M12D

Добавьте период к начальной дате или дате-времени.

LocalDate later = start.plus( p ) ; // Add the `Period` span-of-time to our starting date.

Чтобы рассчитать прошедшее время, используйте Period.between.

Period p = Period.between( startLocalDate , stopLocalDate ) ;

О java.time

java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
person Basil Bourque    schedule 02.02.2018