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


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

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

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

10 89

10 ответов:

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

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

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

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

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

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

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

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

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

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

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

Apache-commons

можно использовать 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);

С Java 8 теперь все очень просто:

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

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

Java 8 Time API:

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

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

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 дней после dateString:dateCalculate(dateString,"yyyy-MM-dd",7);

  • чтобы получить 7 дней до dateString: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());
}

вы можете легко вычесть с календарем с 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;

    }

вы можете просто достичь с помощью библиотеки Joda datetime.

DateTime date = new DateTime().minusDays(300);
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()));