Если у меня есть конкретная дата дня, как мне получить дату этого дня на предыдущей неделе?

СМОТРИТЕ ОТВЕТ ОТ @Basil Bourque для наиболее актуального ответа


Например, если у меня есть переменная "Date" "date1" со значением (dd/mm/yyy) 03/07/2011, которое является воскресенью. Как получить "Дата" предыдущего воскресенья "date2"? который будет иметь значение (дд/мм/гггг) 26/06/2011.

Есть ли простой способ сделать это, например:

псевдокод:

Date date1 = (03/07/2011);
Date date2 = date1.subtractNumberOfDays(7);

Ответ 1

TL;DR

LocalDate.of( 2011 , Month.JULY , 3 )
         .minusWeeks( 1 ) 

2011-06-26

java.time

Вопрос и ответы используют старые устаревшие классы времени. Вместо этого используйте классы java.time.

LocalDate

Класс LocalDate представляет значение даты только без времени и без часового пояса.

LocalDate localDate = LocalDate.of( 2011 , Month.JULY , 3 ); 

В качестве альтернативы, передайте целое число во втором аргументе вместо перечисления Month. Пропустите 1-12 за январь-декабрь.

Предыдущая неделя

Вы можете вычесть неделю с даты.

LocalDate weekPrior = localDate.minusWeeks( 1 );

Смотрите этот запуск кода на IdeOne.com.

Предыдущий день недели

Если вам нужен определенный день недели, используйте TemporalAdjuster.

Несколько таких удобных реализаций, предоставляемых в классе TemporalAdjusters (обратите внимание на множественное число).

LocalDate priorTuesday = localDate.with( TemporalAdjusters.previous( DayOfWeek.TUESDAY ) ) ;

О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятный старый legacy классы даты-времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.

Ответ 2

Вы должны использовать Календарь:

    Calendar date = new GregorianCalendar(2011, Calendar.JULY, 3);
    date.add(Calendar.DAY_OF_MONTH, -7);
    System.out.println(date.getTime());

Вы также можете создать календарь с даты:

    Date date1 = new Date(2011, Calendar.JULY, 3);
    Calendar date = new GregorianCalendar();
    date.setTime(date1);
    date.add(Calendar.DAY_OF_MONTH, -7);
    date2 = date.getTime();

Помните, что:

  • Java использует 0 для представления января!
  • Дата (год, месяц, день) устарела с версии JDK версии 1.1!

См. GregorianCalendar JavaDoc:

Создает GregorianCalendar с указанной датой, установленной в часовом поясе по умолчанию с локалью по умолчанию. Параметры: год, значение, используемое для установки поля календаря ГОД в календаре. месяц значение, используемое для установки поля календаря MONTH в календаре. Значение месяца равно 0. например, 0 за январь. dayOfMonth значение, используемое для установки поля календаря DAY_OF_MONTH в календаре.

Ответ 3

Более четкий подход:

Calendar date = new GregorianCalendar(2011, 1, 1);
date.add(Calendar.WEEK_OF_MONTH, -1);
System.out.println(date.getTime());

используйте либо WEEK_OF_MONTH, либо WEEK_OF_YEAR

Ответ 4

Если вы хотите использовать Joda time, это будет очень просто.

Пример:

DateTime toDay=new DateTime();
DateTime dateOfPreviousWeek=toDay.minusDays(7);

Другой:

DateTime toDay = new DateTime(2011, 7, 1, 0, 0, 0, 0);
DateTime dateOfPreviousWeek = toDay.minusDays(7);

Вы можете получить java.util.Date из DateTime как:

Date javaDate=jodaDateTime.toDate();