Як додати місяць до поточної дати в Java?


Відповіді:


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

спасибі piyush, і що це за формат дат кал, мені потрібно зберегти це в mysql
kiran

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

це правильний формат дати, який повертає cal, який я можу використовувати для зберігання в mysql
kiran

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

3
Це застарілий в даний час: stackoverflow.com/questions/4905416 / ...
softarn


30

Ви можете скористатися допоміжним класом утиліти apache commons lang DateUtils.

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

Ви можете завантажити спільну банку з посиланням http://commons.apache.org/proper/commons-lang/


29

tl; д-р

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 . І шукайте в 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.01.2017

Додайте місяць.

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString (): 23.02.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 . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Де отримати класи java.time?

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


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

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

6

(адаптовано з Duggu)

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

6

Використовуйте каландр і спробуйте цей код.

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

Чи можете ви дати пояснення щодо того, що робить ваш код, а не просто великий блок коду?
Некорас,

Мій код є більш обмежувальним і загальним. Більш рестриктивний, оскільки він обробляє лише дату (у вигляді рядка) із фіксованим форматом "MM / dd / yyyy". Загальний, оскільки він дозволяє додавати будь-який із позитивних місяців на вказану дату.
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

Якщо вам потрібен однокласний вкладиш (тобто для формули звітів Джаспер), і не заперечуйте, якщо коригування не точно один місяць (тобто достатньо "30 днів"):

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


Не забудьте додати суфікс 'L' до числа else, якщо це буде трактуватися як простий 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 Починаючи з версії 1.1 JDK, * замінено на <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);
    }

FYI, страшенно неприємні класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та пізніші версії. Див. Підручник Oracle .
Василь Бурк

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
Перш за все, відповідь неправильна на основі ОП. По-друге, на ОП відповіли 8 (!) Років тому, по-третє, є кращі способи форматування виводу дати, ніж використання навантажень рядків.
Markus Deibel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.