Как добавить один месяц к текущей дате в Java?

В Java, как я могу добавить один месяц к текущей дате?


person kiran    schedule 05.02.2011    source источник
comment
связанные Как я могу увеличить дату на один день на Java?   -  person Petter Friberg    schedule 03.08.2017


Ответы (13)


Ява 8

LocalDate futureDate = LocalDate.now().plusMonths(1);
person softarn    schedule 25.03.2015
comment
Чтобы иметь java.util.Date: Date.from((LocalDate.now().plusMonths(1)).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()) - person Ismail Yavuz; 20.11.2019

Вы можете использовать вспомогательный служебный класс apache commons lang DateUtils.

Date newDate = DateUtils.addMonths(new Date(), 1);

Вы можете загрузить файл jar Commons lang по адресу http://commons.apache.org/proper/commons-lang/.

person mnm    schedule 05.03.2014

tl;dr

LocalDate::plusMonths

Пример:

LocalDate.now( )
         .plusMonths( 1 );

Лучше указать часовой пояс.

LocalDate.now( ZoneId.of( "America/Montreal" )
         .plusMonths( 1 );

Java.время

Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar и java.text.SimpleDateFormat. Команда Joda-Time также рекомендует перейти на java.time.

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

Большая часть функций java.time обратно портирована на Java 6 и 7 в ThreeTen-Backport и дальнейшая адаптация для Android в ThreeTenABP.

Только дата

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

ZoneId z = ZoneId.of( "America/Montreal" );
 LocalDate today = LocalDate.now( z );

сегодня.toString (): 2017-01-23

Добавьте месяц.

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString(): 23 февраля 2017 г.

Дата-время

Возможно, вам нужно время суток вместе с датой.

Сначала получите текущий момент в UTC с разрешением наносекунды.

Instant instant = Instant.now();

Добавление месяца означает определение дат. А определение дат означает применение часового пояса. В любой момент дата меняется по всему миру, и новый день наступает раньше на востоке. Так что настройте этот Instant на часовой пояс.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Теперь добавьте свой месяц. Пусть java.time обрабатывает високосный месяц и тот факт, что месяцы различаются по длине.

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

Возможно, вы захотите настроить время дня на первый момент дня при выполнении такого рода расчетов. Этот первый момент не всегда 00:00:00.0, поэтому пусть java.time определяет время дня.

ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );

О java.time

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

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

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

Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах. Hibernate 5 и JPA 2.2 поддерживают java.time.

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


Джода-Время

Обновление: проект Joda-Time теперь находится в режиме обслуживания. Его команда советует перейти на классы java.time. Я оставляю этот раздел нетронутым для потомков.

Библиотека Joda-Time предлагает способ разумного добавления месяцев.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = DateTime.now( timeZone );
DateTime nextMonth = now.plusMonths( 1 );

Возможно, вы захотите сосредоточиться на дне, настроив время дня на первый момент дня.

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();
person Basil Bourque    schedule 01.08.2014

(адаптировано из Дуггу)

public static Date addOneMonth(Date date)
{
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}
person Bamboomy    schedule 02.10.2014

Используйте каландры и попробуйте этот код.

Calendar calendar = Calendar.getInstance();         
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
Date nextMonthFirstDay = calendar.getTime();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Date nextMonthLastDay = calendar.getTime();
person Madhuka Dilhan    schedule 31.05.2016

вы можете использовать класс DateUtils в пакете org.apache.commons.lang3.time

DateUtils.addMonths(new Date(),1);
person Alireza Alallah    schedule 07.09.2019
comment
Простое и легкое решение. - person Royal.O; 13.03.2020

Если вам нужна однострочная формула (например, для формулы Jasper Reports) и не возражаете, если корректировка составляет не ровно один месяц (т.е. достаточно «30 дней»):

new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)

person Brimstedt    schedule 22.04.2016
comment
Не забудьте добавить суффикс 'L' к числу else, если оно будет рассматриваться как простое целое число и будет переполнено до отрицательного числа! - person Nicolas Buquet; 26.02.2019

Вы можете использовать так;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String d = "2000-01-30";
Date date= new Date(sdf.parse(d).getTime());
date.setMonth(date.getMonth() + 1);
person harun ugur    schedule 25.07.2017
comment
* @deprecated Начиная с JDK версии 1.1, * заменено на ‹code›Calendar.set(Calendar.MONTH, int month)‹/code›. Как говорит Date.java. - person Jasper Lankhorst; 16.04.2018

Чтобы найти день через месяц, нужно посмотреть, какой сегодня день месяца.

Итак, если день первый день месяца, выполните следующий код

Calendar calendar = Calendar.getInstance();

    Calendar calFebruary = Calendar.getInstance();
    calFebruary.set(Calendar.MONTH, Calendar.FEBRUARY);

    if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {// if first day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
    Date nextMonthFirstDay = calendar.getTime();
    System.out.println(nextMonthFirstDay);

    }

если это последний день месяца, запустите следующие коды.

    else if ((calendar.getActualMaximum(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH))) {// if last day of month
    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);
    }

если день в феврале, выполните следующий код

    else if (calendar.get(Calendar.MONTH) == Calendar.JANUARY
            && calendar.get(Calendar.DAY_OF_MONTH) > calFebruary.getActualMaximum(Calendar.DAY_OF_MONTH)) {// control of february

    calendar.add(Calendar.MONTH, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date nextMonthLastDay = calendar.getTime();
    System.out.println(nextMonthLastDay);

    }

следующие коды используются для других случаев.

    else { // any day
    calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date theNextDate = calendar.getTime();
    System.out.println(theNextDate);
    }
person theMind    schedule 08.10.2015
comment
К вашему сведению, ужасно неприятные классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими, вытесненными java.time, встроенные в Java 8 и более поздние версии. См. учебник от Oracle. - person Basil Bourque; 09.07.2019

Этот метод возвращает текущую дату плюс 1 месяц.

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`
person DJAM Silvère Gatien    schedule 05.04.2017

public class StringSplit {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        date(5, 3);
        date(5, 4);
    }

    public static String date(int month, int week) {
        LocalDate futureDate = LocalDate.now().plusMonths(month).plusWeeks(week);
        String Fudate = futureDate.toString();
        String[] arr = Fudate.split("-", 3);
        String a1 = arr[0];
        String a2 = arr[1];
        String a3 = arr[2];
        String date = a3 + "/" + a2 + "/" + a1;
        System.out.println(date);
        return date;
    }
}

Вывод:

10/03/2020
17/03/2020
person vipanshu walia    schedule 18.09.2019
comment
Прежде всего, ответ неверен на основе ОП. Во-вторых, на ОП был дан ответ 8 (!) лет назад, а в-третьих, есть лучшие способы форматирования вывода даты, чем использование множества строк. - person Markus Deibel; 18.09.2019

person    schedule
comment
спасибо, пиюш, и что это за формат даты, мне нужно сохранить это в mysql - person kiran; 05.02.2011
comment
Тип данных mysql для даты - DATETIME. - person kiran; 05.02.2011
comment
это правильный формат даты, который возвращает кал, который я могу использовать для хранения в mysql - person kiran; 05.02.2011
comment
Вопрос отличался от того, что вы задаете сейчас. Однако в MySQL вы можете использовать функцию DATE_ADD для выполнения арифметических операций с датами. Ссылка: dev.mysql. com/doc/refman/5.5/ru/ - person Piyush Mattoo; 05.02.2011
comment
Код Java для добавления месяца к текущей дате в нужном формате будет таким, как показано ниже. Теперь вам нужно преобразовать эту строку в дату и вставить ее в базу данных MYSql. Обратите внимание, что вы можете изменить формат даты в конструкторе DateFormat или позже в запросе MYSQL, используя функцию STR_TO_DATE(str, format). Средство форматирования DateFormat = new SimpleDateFormat (гггг-мм-дд чч: мм: сс); Календарь сейчас = Calendar.getInstance(); now.add(Календарь.МЕСЯЦ, 1); Строка dateString = formatter.format(now.getTime()); - person Piyush Mattoo; 05.02.2011
comment
не могу ли я манипулировать датой для jave, чтобы преобразовать ее в формат mysql? - person kiran; 05.02.2011
comment
Конечно. Я включил приведенный выше код, чтобы выполнить это с помощью объекта формата даты в Java. - person Piyush Mattoo; 05.02.2011
comment
Теперь это устарело: stackoverflow .com/questions/4905416/ - person softarn; 25.03.2015

person    schedule
comment
Можете ли вы объяснить, что делает ваш код, а не просто большой блок кода? - person Necoras; 06.04.2017
comment
Мой код более строгий и более общий. Более ограничительный, потому что он обрабатывает только дату (в виде строки) с фиксированным форматом MM/dd/yyyy . Общий, потому что он позволяет вам добавить любой из положительных месяцев в указанную вами дату. - person DJAM Silvère Gatien; 06.04.2017
comment
Итак, если вам нужен менее строгий код, который берет любой java.util.Date и отображает другой java.util.Date после добавления месяца, см. ниже: Calendar cal = Calendar.getInstance(); cal.setTime (дата); cal.add(Календарь.МЕСЯЦ,1); кал.получить время(); - person DJAM Silvère Gatien; 06.04.2017