java.util.Date - удаление трех месяцев с даты? - PullRequest
40 голосов
/ 21 августа 2009

У меня есть дата типа java.util.Date

Я хочу вычесть из него три месяца.

Не нахожу много радости в API.

Ответы [ 10 ]

81 голосов
/ 21 августа 2009

Вот простая 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 (который вдохновлен Joda):

LocalDateTime.from(referenceDate.toInstant()).minusMonths(3);
14 голосов
/ 21 августа 2009
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.MONTH, -3);

Установите дату, используя setTime метод.

4 голосов
/ 21 августа 2009

I всегда рекомендую Joda для такого рода вещей. У него гораздо более приятный API, и он не страдает от проблем с потоками, которые есть у стандартной даты / времени Java (например, проблемы с SimpleDateFormat или общей изменчивостью).

, например

DateTime result = dt.minusMonths(3);
2 голосов
/ 21 августа 2009

Недостаточно самого класса Date (+: Вы должны использовать класс Calendar здесь

Что-то в этом роде

GregorianCalendar lCalendar = new GregorianCalendar();
lCalendar.setTime( aDate );
lCalendar.add(Calendar.MONTH, -3);

p.s. приведенный выше фрагмент не проверяется на компиляцию.

1 голос
/ 10 сентября 2016

Хорошо с java.sql.Date (подкласс java.util.Date) и 8 LocalDate JDK помогают вам сделать это в одной строке;)

Date date = java.sql.Date.valueOf(LocalDate.now().minus(3, ChronoUnit.MONTHS));
1 голос
/ 07 августа 2014

Вы хотите сегодня - 3 месяца в формате dd MMMM гггг

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

Таким образом, этот код может выполнять работу;)

1 голос
/ 19 ноября 2013
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();
}
0 голосов
/ 02 апреля 2019

Используя Java 8 , вы можете сделать это следующим образом,

Date d = Date.from(LocalDate.now().minusMonths(3).atStartOfDay(ZoneId.systemDefault()).toInstant());

В классе LocalDate есть много методов, которые помогут вам легко вычислить даты, как указано выше,

// Add 2 months
Date d = Date.from(LocalDate.now().plusMonths(2).atStartOfDay(ZoneId.systemDefault()).toInstant());
// Add 5 days
Date d = Date.from(LocalDate.now().plusDays(5).atStartOfDay(ZoneId.systemDefault()).toInstant());
// Minus 1 day and 1 year
Date d = Date.from(LocalDate.now().minusYears(1).minusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());

Для вычисления времени вы можете использовать класс LocalDateTime,

// Minus 1 year, minus 1 days, plus 1 hour
Date d = Date.from(LocalDateTime.now().minusYears(1).minusDays(1).plusHours(1).toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
0 голосов
/ 12 июня 2018

Вы можете использовать

Date d1 = new Date()
d1.setMonth(d1.month-3)

Надеюсь, это поможет

0 голосов
/ 12 сентября 2016

Вы можете использовать Apache Commons Lang3 DateUtils addMonths функция.

static Date addMonths(Date date, int amount)

Добавляет количество месяцев к дате, возвращая новый объект. Первоначальная дата не изменяется. Сумма добавляемой суммы может быть отрицательной , поэтому вы можете вернуться на 3 месяца назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...