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


Ответы:


116
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);

спасибо пиюш, и что это за формат даты, мне нужно сохранить это в mysql
киран

Тип данных mysql для даты - DATETIME.
kiran 05

это правильный формат даты, возвращаемый
калом

1
Код Java для добавления месяца к текущей дате в желаемом формате будет таким, как показано ниже. Теперь вам нужно преобразовать эту строку в дату и вставить в базу данных MYSql. Обратите внимание, что вы можете изменить формат даты в конструкторе DateFormat или позже в запросе MYSQL с помощью функции STR_TO_DATE (str, format). DateFormat formatter = new SimpleDateFormat ("гггг-ММ-дд чч: мм: сс"); Календарь сейчас = Calendar.getInstance (); now.add (Calendar.MONTH, 1); Строка dateString = formatter.format (now.getTime ());
Пиюш Матту

3
Сейчас это устарело: stackoverflow.com/questions/4905416/…
softarn



29

tl; dr

LocalDate::plusMonths

Пример:

LocalDate.now( )
         .plusMonths( 1 );

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

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

java.time

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

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

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

Только дата

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

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

today.toString (): 23 января 2017 г.

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

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

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

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

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

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .


Джода-Тайм

Обновление: проект 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();

12
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
java.util.Date dt = cal.getTime();

6

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

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

6

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

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();

5
public Date  addMonths(String dateAsString, int nbMonths) throws ParseException {
        String format = "MM/dd/yyyy" ;
        SimpleDateFormat sdf = new SimpleDateFormat(format) ;
        Date dateAsObj = sdf.parse(dateAsString) ;
        Calendar cal = Calendar.getInstance();
        cal.setTime(dateAsObj);
        cal.add(Calendar.MONTH, nbMonths);
        Date dateAsObjAfterAMonth = cal.getTime() ;
    System.out.println(sdf.format(dateAsObjAfterAMonth));
    return dateAsObjAfterAMonth ;
}`

Не могли бы вы объяснить, что делает ваш код, а не просто большой блок кода?
Necoras 05

Мой код более строгий и более общий. Более ограниченный, поскольку он обрабатывает только дату (в виде строки) с фиксированным форматом «ММ / дд / гггг». Общий, потому что он позволяет вам добавлять любой положительный месяц в указанную вами дату.
DJAM Silvère Gatien

Итак, если вам нужен менее строгий код, который принимает любой java.util.Date и отображает другой java.util.Date после добавления месяца, см. Ниже: Calendar cal = Calendar.getInstance (); cal.setTime (дата); cal.add (Calendar.MONTH, 1); cal.getTime ();
DJAM Silvère Gatien


2

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

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


Не забудьте добавить суффикс «L» к числу, иначе if будет рассматриваться как простое int и будет переполняться до отрицательного числа!
Николя Буке,

1

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

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);

* @deprecated Начиная с JDK версии 1.1, * заменен на <code> Calendar.set (Calendar.MONTH, int month) </code>. Как говорит Date.java.
Джаспер Ланкхорст

1

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

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

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);
    }

К вашему сведению, ужасно неприятные классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и новее. См. Учебник Oracle .
Basil


0

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

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`

-3
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

1
Прежде всего, ответ неверен на основе OP. Во-вторых, на OP был дан ответ 8 (!) Лет назад, и в-третьих, есть более эффективные способы форматирования вывода даты, чем использование множества строк.
Маркус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.