У меня есть дата типа java.util.Date
Я хочу вычесть из него три месяца.
Не найти много радости в API.
У меня есть дата типа java.util.Date
Я хочу вычесть из него три месяца.
Не найти много радости в API.
Здесь простая версия JDK, ей нужен класс Calendar
в качестве помощника:
Date referenceDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(referenceDate);
c.add(Calendar.MONTH, -3);
return c.getTime();
Но вы должны серьезно подумать об использовании библиотеки Joda из-за различных недостатков Date
и Calendar
. С помощью Joda вы можете сделать следующее:
new DateTime().minusMonths(3).toDate();
Или если вы хотите вычесть из заданной даты вместо текущего:
new DateTime(referenceDate).minusMonths(3).toDate();
Обновление для Java 8: С помощью Java 8 вы также можете использовать новый API JSR 310 (который вдохновлен Джодой):
LocalDateTime.from(referenceDate.toInstant()).minusMonths(3);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.MONTH, -3);
Задайте дату с помощью метода setTime
.
Я всегда рекомендую Joda для такого рода вещей. Он имеет гораздо более удобный API и не страдает от проблем с потоками, которые имеют стандартная дата и время Java (например, проблемы с SimpleDateFormat
или общая изменчивость).
например.
DateTime result = dt.minusMonths(3);
Сам класс Date недостаточно (+: Здесь вы должны использовать класс Calendar
Что-то в этом направлении
GregorianCalendar lCalendar = new GregorianCalendar();
lCalendar.setTime( aDate );
lCalendar.add(Calendar.MONTH, -3);
p.s. фрагмент выше не проверяется на компиляцию.
public static Date getDateMonthsAgo(int numOfMonthsAgo)
{
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, -1 * numOfMonthsAgo);
return c.getTime();
}
вернет дату X месяцев в прошлом. Аналогично, здесь функция, которая возвращает дату X дней в прошлом.
public static Date getDateDaysAgo(int numOfDaysAgo)
{
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DAY_OF_YEAR, -1 * numOfDaysAgo);
return c.getTime();
}
Вы хотите сегодня - 3 месяца в формате dd MMMM yyyy
SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy");
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, -3);
Date d = c.getTime();
String res = format.format(d);
System.out.println(res);
Итак, этот код может выполнить задание;)
Хорошо с java.sql.Date(подкласс java.util.Date) и JDK 8 LocalDate поможет вам сделать это в одной строке;)
Date date = java.sql.Date.valueOf(LocalDate.now().minus(3, ChronoUnit.MONTHS));
Вы можете использовать Apache Commons Lang3 DateUtils addMonths.
static Date addMonths(Date date, int amount)
Добавляет несколько месяцев к дате, возвращающей новый объект. Исходная дата не изменилась. Добавляемая сумма может быть отрицательной, поэтому вы можете вернуться на 3 месяца назад.