В Java, как я могу добавить один месяц к текущей дате?
Как добавить один месяц к текущей дате в Java?
Ответы (13)
Ява 8
LocalDate futureDate = LocalDate.now().plusMonths(1);
Вы можете использовать вспомогательный служебный класс apache commons lang DateUtils.
Date newDate = DateUtils.addMonths(new Date(), 1);
Вы можете загрузить файл jar Commons lang по адресу http://commons.apache.org/proper/commons-lang/.
tl;dr
LocalDate::plusMonths
Пример:
LocalDate.now( )
.plusMonths( 1 );
Лучше указать часовой пояс.
LocalDate.now( ZoneId.of( "America/Montreal" )
.plusMonths( 1 );
Java.время
Платформа 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 );
сегодня.toString (): 2017-01-23
Добавьте месяц.
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
< Платформа em>java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.
Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.
Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах. Hibernate 5 и JPA 2.2 поддерживают java.time.
Где получить классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation.
- Java 9 brought some minor features and fixes.
- Java SE 6 and Java SE 7
- Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
- Later versions of Android (26+) bundle implementations of the java.time classes.
- For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android.
- If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….
Джода-Время
Обновление: проект 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();
(адаптировано из Дуггу)
public static Date addOneMonth(Date date)
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, 1);
return cal.getTime();
}
Используйте каландры и попробуйте этот код.
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();
вы можете использовать класс DateUtils в пакете org.apache.commons.lang3.time
DateUtils.addMonths(new Date(),1);
Если вам нужна однострочная формула (например, для формулы Jasper Reports) и не возражаете, если корректировка составляет не ровно один месяц (т.е. достаточно «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.
- person Basil Bourque; 09.07.2019
Этот метод возвращает текущую дату плюс 1 месяц.
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;
}
}
Вывод:
10/03/2020
17/03/2020