Если у меня есть конкретная дата дня, как мне узнать дату этого дня на предыдущей неделе? - PullRequest
11 голосов
/ 01 июля 2011

СМ. ОТВЕТ ОТ @Basil Bourque за самый актуальный ответ


Например, если у меня есть переменная «Дата» «date1» со значением (дд / мм / ггг) 03/ 07/2011, который является воскресеньем.Как я могу получить "Дата" предыдущего воскресенья "date2"?который будет иметь значение (дд / мм / гггг) 26.06.2011.

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

псевдокод:

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

Ответы [ 4 ]

33 голосов
/ 01 июля 2011

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

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

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

    Date date1 = new Date(111, Calendar.JULY, 3);//the year field adds 1900 on to it.
    Calendar date = new GregorianCalendar();
    date.setTime(date1);
    date.add(Calendar.DAY_OF_MONTH, -7);
    date2 = date.getTime();

Имейте в виду, что:

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

См. Документ Java GrebianCalendar:

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

9 голосов
/ 22 июля 2016

ТЛ; др

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 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

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

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

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

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

4 голосов
/ 01 июля 2011

Если вы готовы использовать Время Joda , это будет очень просто.

Пример:

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();
4 голосов
/ 01 июля 2011

Более понятный подход:

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

...