Метод DateTime addmonths добавляет 1 дополнительный день

В настоящее время я работаю над проблемой, когда DateTime.addMonths(iStartDateH, durationAsInt) добавляет дополнительный день. Он использует GeorgianCalendar для внутреннего использования. В настоящее время мы используем Java 5 в этом проекте. Например: в течение 24 месяцев.

    ExpirationDate=DateTime.addMonths(currentDate, 24)
    CurrentDate= 01/02/2021 (dd/mm/yyyy format)
    ExpirationDate= 02/02/2023
public static ErrorCode addMonths(DateHolder dateH, int numMonths) {
    try {
        Calendar c = new GregorianCalendar();
        c.setTime(dateH.value);
        c.add(Calendar.MONTH, numMonths);
        dateH.value = c.getTime();
        return ErrorCode.successCN;
    }
    catch (Exception e) {
        IlMessage msg = new IlMessage(Msg.exceptionCaughtCN, e);
        IlSession.getSession().getMessageStack().push(msg);
        return ErrorCode.errorCN;
    }
}

Я попытался проверить полную разницу в дате/времени, и она пришла как 730.773935185185185. Пожалуйста, помогите с тем же.


person Sugandha Mahajan    schedule 03.02.2021    source источник
comment
Что это за DateTime, о котором вы говорите? java.time.LocalDateTime? java.util.Date? Можете ли вы дать его полное название?   -  person Sweeper    schedule 03.02.2021
comment
Как определить, что разница составляет 730,773935185185185? Является ли DateHolder вашим собственным классом или классом из какой-то сторонней библиотеки? Который из?   -  person Ole V.V.    schedule 03.02.2021
comment
Ява 5? Бедные люди. Есть ли шанс перейти на более новую версию Java?   -  person MC Emperor    schedule 03.02.2021
comment
@SugandhaMahajan Вы должны поделиться с нами своим DateHolder классом. Без него мы не можем сказать, в чем проблема. Я проверил добавление месяцев с помощью GregorianCalendar и не могу воспроизвести аномалию, которую вы наблюдаете.   -  person MC Emperor    schedule 03.02.2021
comment
Опять же, вам следует перейти на более новую версию Java. Java 5 была выпущена в 2004 году и объявлена ​​устаревшей. в 2009 году, то есть уже очень-очень давно. Конечно, может случиться так, что вы не тот, кто принимает это решение. Но все равно...   -  person MC Emperor    schedule 03.02.2021
comment
Кроме того, я вижу, что ваш класс DateHolder содержит поле public, что обычно не рекомендуется . Кроме того, я думаю, вам следует рассмотреть возможность использования неизменяемых объектов.   -  person MC Emperor    schedule 03.02.2021


Ответы (2)


Я использую Java 8, и я попробовал приведенный ниже код, и он отлично сработал для меня (для целей тестирования я установил дату 1 февраля, как в вашем примере.

    public static void main(String...pStrings) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        LocalDate currentDate = LocalDate.of(2021, 2, 1); //LocalDate.now();
        System.out.println("Original Date -" +currentDate.format(formatter));
        
        LocalDate newDate = currentDate.plusMonths(24);
        System.out.println("updated date - " + newDate.format(formatter));
    }

Я получил вывод: -

Original Date -01/02/2021
updated date - 01/02/2023
person bhaskar    schedule 03.02.2021
comment
К сожалению, в настоящее время мы используем Java 5 и внутренне используем GeorgianCalendar. - person Sugandha Mahajan; 03.02.2021

  1. Обратите внимание, что m означает минуты. В течение месяца нужно использовать M.
  2. Реализация вашего класса, DateHolder, кажется, имеет проблему. С java.util API даты и времени для этого требования такой проблемы нет.

Демонстрация:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH).parse("01/02/2021"));
        System.out.println(calendar.getTime());
        int numMonths = 24;
        calendar.add(Calendar.MONTH, numMonths);
        System.out.println(calendar.getTime());
    }
}

Вывод:

Mon Feb 01 00:00:00 GMT 2021
Wed Feb 01 00:00:00 GMT 2023
person Arvind Kumar Avinash    schedule 03.02.2021