Як я можу додати місяць до поточної дати на Java?
Відповіді:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Java 8
LocalDate futureDate = LocalDate.now().plusMonths(1);
Ви можете скористатися допоміжним класом утиліти apache commons lang DateUtils.
Date newDate = DateUtils.addMonths(new Date(), 1);
Ви можете завантажити спільну банку з посиланням http://commons.apache.org/proper/commons-lang/
LocalDate::plusMonths
Приклад:
LocalDate.now( )
.plusMonths( 1 );
Краще вказати часовий пояс.
LocalDate.now( ZoneId.of( "America/Montreal" )
.plusMonths( 1 );
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 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 зараз перебуває в режимі обслуговування. Його команда радить перехід на заняття 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();
Використовуйте каландр і спробуйте цей код.
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 ;
}`
ви можете використовувати клас DateUtils у пакеті org.apache.commons.lang3.time
DateUtils.addMonths(new Date(),1);
Якщо вам потрібен однокласний вкладиш (тобто для формули звітів Джаспер), і не заперечуйте, якщо коригування не точно один місяць (тобто достатньо "30 днів"):
new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)
Ви можете використовувати так;
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);
Для того, щоб знайти день після місяця, необхідно подивитися, який день місяця це сьогодні.
Отже, якщо день перший день місяця, запустіть наступний код
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 .
Цей метод повертає поточну дату плюс 1 місяць.
public Date addOneMonth() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
return cal.getTime();
}`
Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();
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