Как получить прошедшее воскресенье и в ближайшее воскресенье на Java?

Я спросил Как определить, находится ли дата на этой или следующей неделе в Java?, но ответы были непонятными, поэтому теперь я думаю, что если я смогу найти прошлое Воскресенье и в ближайшее воскресенье, в любой день между ними на этой неделе, и в любой день между наступающим воскресеньем и воскресеньем после этого на следующей неделе, я прав?

Итак, мой новый вопрос: как получить прошедшее воскресенье и в ближайшее воскресенье на Java?

Ответ 1

Как насчет этого:

Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss");
System.out.println(df.format(c.getTime()));      // This past Sunday [ May include today ]
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Next Sunday
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Sunday after next

Результат:

Sun 2010/12/26 00:00:00
Sun 2011/01/02 00:00:00
Sun 2011/01/09 00:00:00

В любой день между двумя первыми на этой неделе, между двумя последними будет следующая неделя.

Ответ 2

java.time

Кратко:

LocalDate.now().with( next( SUNDAY ) ) 

Смотрите этот код в прямом эфире на IdeOne.com.

подробности

Я думал, что добавлю решение Java 8 для потомков. Используя реализацию LocalDate, DayOfWeek и TemporalAdjuster найденную в классе TemporalAdjusters.

final LocalDate today = LocalDate.of(2015, 11, 20);
final LocalDate nextSunday = today.with(next(SUNDAY));
final LocalDate thisPastSunday = today.with(previous(SUNDAY));

Этот подход также работает для других временных классов, таких как ZonedDateTime.

import

Как написано, он предполагает следующий статический импорт:

import java.time.LocalDate;
import static java.time.DayOfWeek.SUNDAY;
import static java.time.temporal.TemporalAdjusters.next;
import static java.time.temporal.TemporalAdjusters.previous;

Ответ 3

Без использования лучшего пакета времени/даты...

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
Calendar now = new GregorianCalendar();
Calendar start = new GregorianCalendar(now.get(Calendar.YEAR), 
        now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) );

while (start.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
    start.add(Calendar.DAY_OF_WEEK, -1);
}

Calendar end = (Calendar) start.clone();
end.add(Calendar.DAY_OF_MONTH, 7);

System.out.println(df.format(now.getTime()) );
System.out.println(df.format(start.getTime()) );
System.out.println(df.format(end.getTime()) );

Если сегодня воскресенье, считается началом периода времени. Если вам нужен период этой недели и следующей недели (как это звучит из вашего вопроса), вы можете заменить 14 вместо 7 в конце .add(...). Время устанавливается в полночь для сравнения другого объекта, падающего между началом и концом.

Ответ 4

Во-первых, не используйте пакет Date/Time из Java. Существует гораздо лучший пакет утилиты Joda-Time - загрузите его и используйте.

Чтобы определить, находится ли ваше время на этой неделе, на прошлой неделе или на любой неделе, сделайте следующее:

  • Создайте два объекта Interval - один на прошлой неделе и один на эту неделю
  • Используйте метод contains (long), чтобы определить, какой интервал содержит дату, которую вы ищете.

Есть несколько интересных способов, которые вы можете создать две недели назад. Вы можете настроить длительность одной недели, найти начальное время в течение первой недели и просто создать два интервала на основе этого времени начала. Не стесняйтесь найти какой-либо другой способ, который работает для вас - пакет имеет множество способов добраться до того, что вы хотите.


EDIT:

Joda-Time может быть загружен здесь, и вот пример того, как Джода сделает это:

// Get the date today, and then select midnight of the first day of the week
// Joda uses ISO weeks, so all weeks start on Monday.
// If you want to change the time zone, pass a DateTimeZone to the method toDateTimeAtStartOfDay()
DateTime midnightToday = new LocalDate().toDateTimeAtStartOfDay();
DateTime midnightMonday = midnightToday.withDayOfWeek( DateTimeConstants.MONDAY );

// If your week starts on Sunday, you need to subtract one.  Adjust accordingly.
DateTime midnightSunday = midnightMonday.plusDays( -1 );

DateTime midnightNextSunday = midnightSunday.plusDays( 7 );
DateTime midnightSundayAfter = midnightNextSunday.plusDays( 7 );

Interval thisWeek = new Interval( midnightSunday, midnightNextSunday );
Interval nextWeek = new Interval( midnightNextSunday, midnightSundayAfter );

if ( thisWeek.contains( someDate.getTime() )) System.out.println("This week");
if ( nextWeek.contains( someDate.getTime() )) System.out.println("Next week");

Ответ 5

Недавно я разработал Lamma Date, который предназначен для решения этого прецедента:

Date today = new Date(2014, 7, 1);      // assume today is 2014-07-01
Date previousSunday = today.previousOrSame(DayOfWeek.SUNDAY);   // 2014-06-29
Date nextSunday = today.next(DayOfWeek.SUNDAY);                 // 2014-07-06

Ответ 8

Вы можете попробовать работать с полем Calendar.WEEK_OF_YEAR, которое дает вам числовое представление недели в текущем году.

@Test
public void testThisAndNextWeek() throws Exception {
    GregorianCalendar lastWeekCal = new GregorianCalendar(2010,
            Calendar.DECEMBER, 26);
    int lastWeek = lastWeekCal.get(Calendar.WEEK_OF_YEAR);

    GregorianCalendar nextWeekCal = new GregorianCalendar(2011,
            Calendar.JANUARY, 4);
    int nextWeek = nextWeekCal.get(Calendar.WEEK_OF_YEAR);

    GregorianCalendar todayCal = new GregorianCalendar(2010,
            Calendar.DECEMBER, 27);
    int currentWeek = todayCal.get(Calendar.WEEK_OF_YEAR);

    assertTrue(lastWeekCal.before(todayCal));
    assertTrue(nextWeekCal.after(todayCal));
    assertEquals(51, lastWeek);
    assertEquals(52, currentWeek);
    // New Year.. so it 1
    assertEquals(1, nextWeek);
}

Ответ 9

Мое решение:

    LocalDate date = ...;
    LocalDate newWeekDate = date.plusDays(1);
    while (newWeekDate.getDayOfWeek() != DayOfWeek.SATURDAY &&
           newWeekDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
        newWeekDate = date.plusDays(1);
    }

Ответ 10

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

private static void nextSunday() throws ParseException 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(new Date());
        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
        int days = Calendar.SUNDAY - weekday;
        if (days < 0)
        {
            days += 7;
        }
        calendar.add(Calendar.DAY_OF_YEAR, days);

        System.out.println(sdf.format(calendar.getTime()));
    }