Java-как вычислить первый и последний день каждой недели
Я пытаюсь создать еженедельный календарь, который выглядит следующим образом: http://dhtmlx.com/docs/products/dhtmlxScheduler/sample_basic.html
Как я могу вычислить каждую неделю дату? Например, на этой неделе:
Понедельник-Воскресенье
7 Июня, 8 Июня, 9 Июня, 10 Июня, 11 Июня, 12 Июня, 13 Июня
11 ответов:
Я думаю, что это делает то, что вы хотите:
// 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); }
Первый день этой недели.
Calendar c = Calendar.getInstance(); while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { c.add(Calendar.DATE, -1); }
Простая установка дня недели не кажется надежной. Рассмотрим следующий простой код:
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
С новым 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); }
Java.время
Использование библиотеки
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
Вы можете построить на этом: следующий код печатает первую и последнюю даты каждой недели в течение 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); }
Если вы знаете, какой сегодня день (пятница) и текущая дата (11 июня), вы можете вычислить другие дни на этой неделе.
Я рекомендую вам использовать библиотеку времени Joda. Класс григорианского календаря имеет методы weekOfWeekyear и dayOfWeek.
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); }
Алгоритм, который вы ищете (вычисление дня недели для любой заданной даты), - это "конгруэнтность Зеллера". Вот реализация Java:
Http://technojeeves.com/joomla/index.php/free/57-zellers-congruence
Comments