Як відняти X день від об’єкта Date на Java?


147

Я хочу зробити щось на кшталт:

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

Як це зробити?


4
Обов’язкове зауваження "Використовуйте час джода".
Стів Маклауд

1
Наступні посилання можуть бути корисними для вас. [Введіть опис посилання тут] [1] [введіть тут опис посилання] [2] [1]: stackoverflow.com/questions/212321/… [2]: stackoverflow.com/questions/ 2623610 /…
Амі

FYI, старі класи, java.util.Dateякі зараз неспокійні, такі, як зараз, застарілі , замінені класами java.time .
Василь Бурк

Відповіді:


280

Java 8 та новіших версій

Зі зміною API часу дати Java 8, Використовуйте LocalDate

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

Так само ви можете мати

LocalDate date = someLocalDateInstance.minusDays(300);

Зверніться до https://stackoverflow.com/a/23885950/260990 для перекладу між java.util.Date <--> java.time.LocalDateTime

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Java 7 і новіші версії

Використовуйте Calendarросійський add()метод

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

22
Це встановити свій власний dateInstance, якщо ви не хочете враховувати поточний час дати
Jigar Joshi

11
Обробка дати Java настільки роздута!
digory doo

1
Це відповідь 4 роки. з'явилися нові зміни API API DateTime, внесені до останніх його версій. Я відредагую відповідь
Jigar Joshi

FYI, клопітно старі класи дати і часу , такі як java.util.Date, java.util.Calendarі java.text.SimpleTextFormatтепер спадщина , витісняється java.time класів. Дивіться Підручник від Oracle .
Василь Бурк

@JigarJoshi було б приголомшливо, якби ви оновили свою відповідь за допомогою Java 8 API. Ваша відповідь - це прийняте, яке люди бачать першими.
jotaen

47

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

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

Apache-commons

Однією з можливостей є використання apache-commons-lang . Ви можете зробити це, використовуючи DateUtilsнаступне:

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

Звичайно, додайте commons-langзалежність робити лише віднімання дати, мабуть, це не дуже вдалі варіанти, однак якщо ви вже використовуєте commons-langце хороший вибір. Існує також зручні способи до addYears, addMonths, addWeeksі так далі, подивіться на апі тут .

Java 8

Ще одна можливість - скористатися новим LocalDateз Java 8, використовуючи minusDays(long days)метод:

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

Немає сенсу використовувати LocalDateTimeяк цей клас навмисно, не має поняття часового поясу, ані зміщення від UTC. Використовуйте це лише тоді, коли зона / зміщення невідомі або не мають значення. Замість цього використовуйте LocalDateта передайте а ZoneIdпри виклику його nowметоду. Дивіться правильну відповідь Якова Ван Лінген.
Василь Бурк

1
@BasilBourque Після вашої поради я перевіряю api, і ви абсолютно праві, тому я оновлюю відповідь. Дякую.
Альбфіф

Брайан Montellano хотів би коментар: там не повинно бути sв DateUtils, це просто DateUtil.
Оле ВВ

@ OleV.V. Брайан Монтеллано помиляється, ви можете перевірити DateUtilsдокументи
Альбіциф

33

Просто скористайтеся цією метою, щоб отримати дату раніше, ніж 300 днів, а 300 замініть на дні

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

Ось

DateTime є org.joda.time.DateTime;

Date є java.util.Date


7
Проект Joda-Time зараз перебуває в режимі обслуговування та радить міграцію до класів java.time .
Василь Бурк

13

API часу Java 8:

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

Я маю на увазі API Java 8, а не 7. І згадування пакета java.timeможе допомогти. Крім того, деяке обговорення / пояснення зазвичай очікується на переповнення стека, а не просто фрагмент коду. Ви обов'язково повинні пояснити, Durationяк це додається цінність Вашого відповіді над існуючим Ван Лінген .
Василь Бурк

Ява 8 справи, виправлено
Григорій Кіслін

так близько, але має бути для зміни об’єкта довільної дати, а не "зараз"
бхарал

9

Як ви можете побачити ТУТ, ви можете зробити багато маніпуляцій. Ось приклад, що показує, що ви могли зробити!

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
*/

@ Джигар Джоші: Я не бачив вашої відповіді ... Чи слід видалити шахту?
waldyr.ar

FYI, жахливі старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

9

З Java 8 зараз це дуже просто:

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

Чудовий путівник по нових api можна знайти тут .


4
Я пропоную завжди передавати необов'язковий часовий пояс (або зміщення з-за UTC) до цього nowметоду. Якщо пропущено, поточний часовий пояс JVM за замовчуванням застосовується неявно і безшумно. Цей дефолт лежить поза вашим контролем і може змінюватися в будь-який момент, навіть під час виконання. Приклад: LocalDate.now( ZoneId.of( "America/Montreal" ).
Василь Бурк

потрібно знаходитись на об'єкті довільної дати відповідно до питання, а не "зараз"
бхарал

1

Я створив функцію, щоб полегшити завдання.

  • Протягом 7 днів після датиСтринг: 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());
}

Ця відповідь використовує клопітно старі класи дати і часу , такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatщо тепер спадщина , витіснили java.time класів. Дивіться Підручник від Oracle .
Василь Бурк

Питання включає об'єкти дати та часу, не створюючи рядки. До речі, LocalDate.parse( "2017-01-23").plusWeeks( 1 )простіше, ніж писати власний метод, і є більш самостійним документуванням.
Василь Бурк

0

Ви можете легко відняти з календаря за допомогою 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;

    }

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

2
Ласкаво просимо до SO. Будь ласка, утримуйтесь від відповідей лише з коду. Див. Stackoverflow.com/help/how-to-answer . І будь ласка, відформатуйте свій код.
Uwe Allner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.