Jak dodać jeden miesiąc do aktualnej daty w Javie?

Odpowiedzi:

116
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
Piyush Mattoo
źródło
thanx piyush, i jaki ten format daty kalibru, muszę to zapisać w mysql
kiran
Typ danych mysql dla daty to DATETIME.
kiran
czy jest to poprawny format daty, który zwraca, którego mogę użyć do przechowywania w mysql
kiran
1
Kod Java dodający miesiąc do bieżącej daty w żądanym formacie wyglądałby tak, jak pokazano poniżej. Teraz do Ciebie należy przekonwertowanie tego ciągu znaków na datę i wstawienie go do bazy danych MYSql. Zauważ, że możesz zmienić format daty w konstruktorze DateFormat lub później w zapytaniu MYSQL za pomocą funkcji STR_TO_DATE (str, format). DateFormat formatter = nowy SimpleDateFormat ("rrrr-MM-dd gg: mm: ss"); Calendar now = Calendar.getInstance (); now.add (Calendar.MONTH, 1); String dateString = formatter.format (now.getTime ());
Piyush Mattoo,
3
To jest teraz nieaktualne: stackoverflow.com/questions/4905416/ ...
softarn
50

Java 8

LocalDate futureDate = LocalDate.now().plusMonths(1);
softarn
źródło
1
Aby mieć java.util.Date: Date.from ((LocalDate.now (). PlusMonths (1)). AtStartOfDay (). AtZone (ZoneId.systemDefault ()). ToInstant ())
Ismail Yavuz
29

tl; dr

LocalDate::plusMonths

Przykład:

LocalDate.now( )
         .plusMonths( 1 );

Lepiej określić strefę czasową.

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

java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te zastąpić dawne zajęcia kłopotliwe Date-Time, takich jak java.util.Date, .Calendar, i java.text.SimpleDateFormat. Czas Jody zaleca również migrację do java.time.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień.

Znaczna część funkcjonalności java.time jest przenoszona z powrotem do Javy 6 i 7 w ThreeTen-Backport i dalej dostosowywana do Androida w ThreeTenABP .

Tylko data

Jeśli chcesz mieć tylko datę, użyj LocalDateklasy.

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

dzisiaj.toString (): 2017-01-23

Dodaj miesiąc.

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString (): 2017-02-23

Data-godzina

Może chcesz podać godzinę wraz z datą.

Najpierw uzyskaj bieżący moment w UTC z rozdzielczością nanosekund .

Instant instant = Instant.now();

Dodanie miesiąca oznacza określenie dat. A określenie dat oznacza zastosowanie strefy czasowej. W dowolnym momencie data zmienia się na całym świecie, a nowy dzień wschodzi wcześniej na wschodzie. Więc dostosuj to Instantdo strefy czasowej.

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

Teraz dodaj swój miesiąc. Niech java.time zajmie się miesiącem przestępnym i faktem, że miesiące mają różną długość.

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

Dokonując tego rodzaju obliczeń, możesz chcieć dostosować porę dnia do pierwszej chwili dnia. Nie zawsze jest to pierwsza chwila, 00:00:00.0więc pozwól java.time określić porę dnia.

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

Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, iSimpleDateFormat .

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Skąd wziąć klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .


Joda-Time

Aktualizacja: Projekt Joda-Time jest teraz w trybie konserwacji. Jego zespół doradza migrację do klas java.time. Zostawiam tę sekcję nietkniętą dla potomności.

Biblioteka Joda-Time oferuje metodę dodawania miesięcy w inteligentny sposób.

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

Możesz skupić się na dniu, dostosowując porę dnia do pierwszej chwili dnia.

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();
Basil Bourque
źródło
12
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
java.util.Date dt = cal.getTime();
kelevra88
źródło
6

(na podstawie Duggu)

public static Date addOneMonth(Date date)
{
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}
Bamboomy
źródło
6

Użyj kalandera i wypróbuj ten kod.

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();
Madhuka Dilhan
źródło
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 ;
}`
DJAM Silvère Gatien
źródło
Czy możesz wyjaśnić, co robi twój kod, a nie tylko duży blok kodu?
Necoras
Mój kod jest bardziej restrykcyjny i bardziej ogólny. Bardziej restrykcyjne, ponieważ obsługuje tylko datę (w postaci ciągu) o ustalonym formacie „MM / dd / rrrr”. Ogólny, ponieważ umożliwia dodanie dowolnego dodatniego miesiąca w określonym dniu.
DJAM Silvère Gatien
Tak więc, jeśli musisz mieć mniej restrykcyjny kod, który pobiera dowolną java.util.Date i renderuje inną java.util.Date po dodaniu miesiąca, zobacz poniżej: Calendar cal = Calendar.getInstance (); cal.setTime (data); cal.add (Calendar.MONTH, 1); cal.getTime ();
DJAM Silvère Gatien
3

możesz użyć klasy DateUtils w pakiecie org.apache.commons.lang3.time

DateUtils.addMonths(new Date(),1);
Alireza Alallah
źródło
Proste i łatwe rozwiązanie.
Royal.
2

Jeśli potrzebujesz jednej linijki (np. Dla formuły Jasper Reports) i nie masz nic przeciwko, jeśli korekta nie wynosi dokładnie jednego miesiąca (tj. Wystarczy „30 dni”):

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

Brimstedt
źródło
Nie zapomnij dodać przyrostka „L” do liczby w przeciwnym razie, jeśli zostanie potraktowane jako zwykłe int i przepełni się do liczby ujemnej!
Nicolas Buquet
1

Możesz używać w ten sposób;

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);
harun ugur
źródło
* @deprecated Od wersji JDK 1.1 * zastąpione przez <code> Calendar.set (Calendar.MONTH, int month) </code>. Jak mówi Date.java.
Jasper Lankhorst
1

Aby znaleźć dzień po miesiącu, należy przyjrzeć się, jaki dzień miesiąca jest dzisiaj.

Więc jeśli dzień jest pierwszym dniem miesiąca, uruchom następujący kod

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

    }

jeśli dzień jest ostatnim dniem miesiąca, uruchom następujące kody.

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

jeśli dzień jest w lutym, należy uruchomić następujący kod

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

    }

następujące kody są używane w innych przypadkach.

    else { // any day
    calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    Date theNextDate = calendar.getTime();
    System.out.println(theNextDate);
    }
umysł
źródło
FYI, strasznie kłopotliwe klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque
1
    Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
Pradeep nain
źródło
0

Ta metoda zwraca bieżącą datę plus 1 miesiąc.

public Date  addOneMonth()  {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTime();
}`
DJAM Silvère Gatien
źródło
-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;
    }
}

Wynik:

10/03/2020
17/03/2020
vipanshu walia
źródło
1
Przede wszystkim odpowiedź jest błędna na podstawie PO. Po drugie, odpowiedź na OP została udzielona 8 (!) Lat temu, a po trzecie, istnieją lepsze sposoby formatowania danych wyjściowych niż używanie mnóstwa ciągów.
Markus Deibel