Как вычесть X-день из объекта Date в Java?

Я хочу сделать что-то вроде:

Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"

Как это сделать?

Ответ 1

Java 8 и более поздние версии

С изменением API дат Java 8, используйте LocalDate

LocalDate date = LocalDate.now().minusDays(300);

Java 7 и более ранние версии

Использовать метод Calendar add()

Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();

Ответ 2

Я бы порекомендовал вам использовать библиотеку DateTime, найденную здесь: https://www.joda.org/joda-time/

Это одна из моих самых первых зависимостей, которую я добавляю почти к каждому проекту Java, который я создаю.

Если у вас есть код устаревшего кода, требующий даты или календари, вы можете преобразовать его из DateTimes.

Таким образом, вычитание 300 дней будет таким же простым, как:

Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();

Ответ 3

@JigarJoshi это хороший ответ, и, конечно, также @Tim рекомендации для использования. йода-время.

Я хочу добавить больше возможностей для вычитания дней из java.util.Date.

Apache-Обще

Одна из возможностей - использовать apache-commons-lang. Вы можете сделать это с помощью DateUtils следующим образом:

Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

Разумеется, добавить зависимость от commons-lang чтобы сделать только дату, вычесть ее, вероятно, не очень хорошие варианты, однако, если вы уже используете commons-lang это хороший выбор. Также есть удобные методы addYears, addMonths, addWeeks и т.д., Взгляните на api здесь.

Java 8

Другой возможностью является использование нового LocalDate из Java 8 с использованием minusDays(long days):

LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);

Ответ 4

Java 8 Time API:

Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);

Ответ 5

С Java 8 это действительно просто:

 LocalDate date = LocalDate.now().minusDays(300);

Подробное руководство по новому api можно найти здесь.

Ответ 6

Как вы можете видеть ЗДЕСЬ, есть много манипуляций, которые вы можете сделать. Вот пример, показывающий, что вы могли бы сделать!

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();

//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));

//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));

/* Can be Calendar.DATE or
*  Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/

Ответ 7

Я создал функцию, облегчающую задачу.

  • В течение 7 дней после датыString: dateCalculate(dateString,"yyyy-MM-dd",7);

  • Чтобы получить 7 дней до датыString: dateCalculate(dateString,"yyyy-MM-dd",-7);


public static String dateCalculate(String dateString, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    try {
        cal.setTime(s.parse(dateString));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    cal.add(Calendar.DATE, days);
    return s.format(cal.getTime());
}

Ответ 8

Вы можете легко вычитать с календарем с помощью SimpleDateFormat

 public static String subtractDate(String time,int subtractDay) throws ParseException {


        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
        cal.setTime(sdf.parse(time));
        cal.add(Calendar.DATE,-subtractDay);
        String wantedDate = sdf.format(cal.getTime());

        Log.d("tag",wantedDate);
        return wantedDate;

    }

Ответ 9

@albciff, Вы писали:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

В DateUtils не должно быть "s". Поэтому рабочий код в Apache:
Date dateBeforeToday = DateUtil.addDays(new Date(),-1);

Ответ 10

Вы можете просто использовать библиотеку datetime joda.

DateTime date = new DateTime().minusDays(300);

Ответ 11

c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));