W jaki sposób w Javie mogę dodać jeden miesiąc do aktualnej daty?
Odpowiedzi:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Java 8
LocalDate futureDate = LocalDate.now().plusMonths(1);
Możesz skorzystać z pomocniczej klasy pomocniczej DateUtils ze wspólnoty lang Apache.
Date newDate = DateUtils.addMonths(new Date(), 1);
Możesz pobrać commons lang jar ze strony http://commons.apache.org/proper/commons-lang/
LocalDate::plusMonths
Przykład:
LocalDate.now( )
.plusMonths( 1 );
Lepiej określić strefę czasową.
LocalDate.now( ZoneId.of( "America/Montreal" )
.plusMonths( 1 );
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 .
Jeśli chcesz mieć tylko datę, użyj LocalDate
klasy.
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
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 Instant
do 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.0
więc pozwól java.time określić porę dnia.
ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId );
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 .
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();
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();
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 ;
}`
możesz użyć klasy DateUtils w pakiecie org.apache.commons.lang3.time
DateUtils.addMonths(new Date(),1);
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)
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);
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);
}
java.util.Date
, java.util.Calendar
i java.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
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();
}`
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