Есть ли способ добавить месяцы к дате получения ожидаемого ниже - PullRequest
0 голосов
/ 03 мая 2019

Есть ли механизм или метод в самом Joda Time / или какой-то другой API, с помощью которого я могу добиться того же. ???Пожалуйста, предложите?

Дата ввода: 2018-04-30

Используемое время Joda, как это дает вывод: 2018-05-30

Ожидаемая дата: 2018-05-31

Повторно отредактировано Хотите знать, будет ли правильно говорить и делать подобное значение

, если введенная дата является последней датой (будет использоватьсяalgos shared), затем извлекает последнюю дату следующего месяца и

, если в качестве даты ввода используется что-то еще, используйте метод plusMonths

right ??

String startDate = "2018-04-30";
DateTime startDateTime = new DateTime(startDate, DateTimeZone.UTC);

int repeatEvery = 1;
int numOfPayments = 2;
String endDate = startDateTime.plusMonths(repeatEvery * (numOfPayments-1)).toString();
System.out.println(endDate);

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Используя Java Time API, довольно просто получить последний день месяца, используя TemporalAdjuster, API поставляется с некоторыми уже определенными, такими как TemporalAdjusters.lastDayOfMonth().

Итак, вотпростой пример того, как получить последний день следующего месяца (на основе сегодняшнего дня).

LocalDate date = LocalDate.now()
    .plus(1, ChronoUnit.MONTHS)
    .with(TemporalAdjusters.lastDayOfMonth()));

Это довольно многословно, чтобы быть понятным, я верю.

Чтобы разобрать строку вLocalDate.Просто замените now() на parse(), например:

LocalDate.parse("2019-05-03", DateTimeFormatter.ISO_DATE);

Использование:

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;

На самом деле это уже ответ в дубликате предлагаемый, просто нужно немного ругаться, чтобы найти его.Это озеленяет видимость !!

0 голосов
/ 03 мая 2019

Вы можете сделать это с помощью Календаря

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String startDate = "2018-04-30";

    int repeatEvery = 1;
    int numOfPayments = 2;

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(sdf.parse(startDate));
    cal.add(Calendar.MONTH, repeatEvery * (numOfPayments - 1));
    System.out.println("intRes: "+sdf.format(cal.getTime()));

    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

    String endDate = sdf.format(cal.getTime());

    System.out.println(endDate);

out :

intRes: 2018-05-30

2018-06-01

Я не знаю, почему это дает мне 2018-06-01?

...