Java - Как рассчитать первый и последний день каждой недели - PullRequest
16 голосов
/ 11 июня 2010

Я пытаюсь создать еженедельный календарь, который выглядит следующим образом: http://dhtmlx.com/docs/products/dhtmlxScheduler/sample_basic.html

Как рассчитать дату каждой недели? Например, на этой неделе:

понедельник - воскресенье
7 июня, 8 июня, 9 июня, 10 июня, 11 июня, 12 июня, 13 июня

Ответы [ 11 ]

41 голосов
/ 11 июня 2010

Я думаю, это то, что вы хотите:

// Get calendar set to current date and time
Calendar c = Calendar.getInstance();

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

// Print dates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i < 7; i++) {
    System.out.println(df.format(c.getTime()));
    c.add(Calendar.DATE, 1);
}
8 голосов
/ 11 июня 2010

Первый день этой недели.

    Calendar c = Calendar.getInstance();
    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        c.add(Calendar.DATE, -1);
    }
7 голосов
/ 21 июня 2015

С новым API даты и времени в Java 8 вы должны сделать:

LocalDate now = LocalDate.now();

// determine country (Locale) specific first day of current week
DayOfWeek firstDayOfWeek = WeekFields.of(Locale.getDefault()).getFirstDayOfWeek();
LocalDate startOfCurrentWeek = now.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));

// determine last day of current week
DayOfWeek lastDayOfWeek = firstDayOfWeek.plus(6); // or minus(1)
LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(lastDayOfWeek));

// Print the dates of the current week
LocalDate printDate = startOfCurrentWeek;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE dd/MM/yyyy");
for (int i=0; i < 7; i++) {
    System.out.println(printDate.format(formatter));
    printDate = printDate.plusDays(1);
}
6 голосов
/ 21 сентября 2011

Простая установка дня недели не кажется надежной. Рассмотрим следующий простой код:

Calendar calendar = Calendar.getInstance(Locale.GERMANY);
calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n", calendar);
System.out.printf("First day of week: %d%n", calendar.getFirstDayOfWeek());

Результат выполнения этой программы:

Starting day: 2011-09-18
Last monday: 2011-09-19
First day of week: 2

Другими словами, он шагнул вперед во времени. Для немецкого языка это действительно не ожидаемый ответ. Обратите внимание, что календарь правильно использует понедельник в качестве первого дня недели (возможно, только для вычисления недели года).

5 голосов
/ 23 ноября 2015

Java.time

Использование библиотеки java.time, встроенной в Java 8:

import java.time.DayOfWeek;
import java.time.LocalDate;
import static java.time.temporal.TemporalAdjusters.previousOrSame;
import static java.time.temporal.TemporalAdjusters.nextOrSame;

LocalDate now = LocalDate.now(); # 2015-11-23
LocalDate first = now.with(previousOrSame(DayOfWeek.MONDAY)); # 2015-11-23
LocalDate last = now.with(nextOrSame(DayOfWeek.SUNDAY)); # 2015-11-29

Вы можете перебрать DayOfWeek.values(), чтобы получить все дни текущей недели

DayOfWeek.values(); # Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY)
for (DayOfWeek day: DayOfWeek.values()) {
    System.out.print(first.with(nextOrSame(day)));
} # 2015-11-23, 2015-11-24, 2015-11-25, 2015-11-26, 2015-11-27, 2015-11-28, 2015-11-29
2 голосов
/ 11 июня 2010

Вы можете воспользоваться этим: следующий код печатает первые и последние даты каждой недели в течение 15 недель.

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
for(int i=0; i<15; i++)
{
    System.out.print("Start Date : " + c.getTime() + ", ");
    c.add(Calendar.DAY_OF_WEEK, 6);
    System.out.println("End Date : " + c.getTime());
    c.add(Calendar.DAY_OF_WEEK, 1);
}
1 голос
/ 26 апреля 2016
    Calendar startCal = Calendar.getInstance();
    startCal.setTimeInMillis(startDate);
    Calendar endCal = Calendar.getInstance();
    endCal.setTimeInMillis(endDate);
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy");
    while (startCal.before(endCal)) {
        int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR);
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
        Date sunday = cal.getTime();
        Log.d("sunday", "" + sdf.format(sunday));
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
        Date saturday = cal.getTime();
        Log.d("saturday", "" + sdf.format(saturday));
        weekNumber = weekNumber + 1;
        startCal.set(Calendar.WEEK_OF_YEAR, weekNumber);

    }
1 голос
/ 11 июня 2010

Я рекомендую использовать Joda Библиотека времени.Класс григорианского календаря имеет методы weekOfWeekyear и dayOfWeek.

1 голос
/ 11 июня 2010

Если вы знаете, какой это день (пятница) и текущая дата (11 июня), вы можете рассчитать остальные дни этой недели.

0 голосов
/ 11 июня 2010

Алгоритм, который вы ищете (вычисление дня недели для любой заданной даты), это «Конгруэнция Целлера». Вот реализация Java:

http://technojeeves.com/joomla/index.php/free/57-zellers-congruence

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...