Проблемы с датой, используя календарь - Java - PullRequest
0 голосов
/ 18 мая 2019

У меня проблема при попытке использовать Календарь.Посмотрите:

public static Calendar novaData(Calendar originDate, Integer amountMonth) {
    System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
    Calendar date = new GregorianCalendar(originDate.getTimeZone());
    date.add(Calendar.MONTH, amountMonth);
    System.out.println(date.getTime());
    return date;
}

Теперь консоль: enter image description here

В этом методе я установлю дату и сумму месяца, в который я собираюсьдобавить к этой дате.Проблема в том, что день наступает, как сегодня (18), а не день 1, как я прошел.Ожидаемый результат: май / 01/2019 - июнь / 01/2019 - июль / 01/2019

Ответы [ 2 ]

1 голос
/ 18 мая 2019

java.time

    LocalDate originDate = LocalDate.of(2019, Month.MAY, 1);
    for (int amountMonth = 1; amountMonth <= 3; amountMonth++) {
        System.out.println("Origin date: " + originDate + " - Add " + amountMonth + " Months");
        System.out.println(originDate.plusMonths(amountMonth));
    }

Вывод:

Origin date: 2019-05-01 - Add 1 Months
2019-06-01
Origin date: 2019-05-01 - Add 2 Months
2019-07-01
Origin date: 2019-05-01 - Add 3 Months
2019-08-01

Я понял из вашего желаемого вывода, что вас интересует только дата, а невремя суток, ни часовой пояс.Если это так, класс LocalDate является правильным для использования.

Если вас интересует только месяц, а не день месяца, используйте YearMonth вместо LocalDate.Код будет таким же, за исключением объявления и инициализации:

    YearMonth originDate = YearMonth.of(2019, Month.MAY);
Origin date: 2019-05 - Add 1 Months
2019-06
(etc.)

Не используйте Calendar и GregorianCalendar.Эти классы плохо разработаны и давно устарели.Вдобавок к этому они несут с каждым объектом время суток, часовой пояс, недельную схему и многое другое, и все это, я не думаю, что вам нужно, и это только рискует запутать тех, кто читает ваш код.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

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

Во-первых, если это вообще возможно, рассмотрите возможность использования более новых объектов Java Date. См., Например, этот блог .

Однако особая проблема OP заключается в том, что вызов new GregorianCalendar будет создан на основе текущей даты / времени пользователя . Он не использует указанную дату / время originDate.

Один из способов настройки кода:

public static Calendar novaData(Calendar originDate, Integer amountMonth) {
    System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
    Calendar date = new GregorianCalendar();
    date.setTime(originDate.getTime());
    date.setTimeZone(originDate.getTimeZone());

    date.add(Calendar.MONTH, amountMonth);
    System.out.println(date.getTime());

    return date;
}

На основании входных данных теста выход сдвигается на месяц вперед. Смотрите здесь

Дата отправления: сб 18 мая 18:01:21 GMT 2019 - Добавить 0 месяцев
Сб 18 мая 18:01:21 GMT 2019
Дата происхождения: сб 18 мая 18:01:21 GMT 2019 - Добавить 1 месяц
Вт 18 июня 18:01:21 GMT 2019
Дата происхождения: сб 18 мая 18:01:21 GMT 2019 - Добавить 2 месяца
Чт 18 июля 18:01:21 GMT 2019

Обратите внимание, что проблемы с високосными годами, отрицательными суммами и т. Д. Не рассматриваются полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...