2016-12-05 2 views
-3

Я хочу получить дни в четыре/пять недель месяца. Например, если я дам вход как "Dec 2016" - тогда я должен получить дни, как нижеjava найти дни в разные недели в месяце

первой недели 1, 2, 3, 4 второй недели 5, 6, 7, 8, 9, 10, 11 Третья неделя 12,13,14,15,16,17,18 Четвертая неделя 19,20,21,22,23,24,25 Пятая неделя 26,27,28,29

Я попытался с помощью calendar но это слишком много кода - если у вас есть какие-либо известные решения, любезно предлагайте.

Я использую Java 8 - так что, если это возможно с помощью LocalDate, это было бы здорово

+1

Возможно, вам помогут, если вы покажете, что вы пробовали. Пока он стоит, вы просите сделать свою работу за вас. – lexicore

+0

Уточните, как именно вы определяете неделю. –

ответ

1

Это решение

package mypackage; 

import java.time.DayOfWeek; 
import java.time.LocalDate; 
import java.util.ArrayList; 
import java.util.List; 
import java.time.temporal.TemporalAdjusters; 
import java.time.temporal.ChronoUnit; 


public class DataUtil { 

    public static void main(String[] args) { 
     List<String> weeks = new ArrayList<>(); 

     LocalDate firstDayOfMonth = LocalDate.of(2016, 12 , 1); 
     LocalDate firstWeekendOfMonth= firstDayOfMonth.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)); 

     long firstWeekGap = ChronoUnit.DAYS.between(firstDayOfMonth , firstWeekendOfMonth) ; 

     String daysInWeek = buildDaysInWeek(1,12,2016); 
     weeks.add("{" + daysInWeek +"}"); 


     for (int i = ((int)firstWeekGap +1) ; i <= 31 ; i = i+7 ) 
     { 
      daysInWeek = buildDaysInWeek(i,12,2016); 
      weeks.add("{" + daysInWeek +"}"); 

     } 

     System.out.println( " weeks " + weeks); 


    } 

    private static String buildDaysInWeek(int date,int month, int year) 
    { 
     StringBuffer daysInWeek = new StringBuffer(); 

     LocalDate startDate = LocalDate.of(year , month , date); 

     daysInWeek.append(startDate.getDayOfMonth()); 

     LocalDate endOfWeek = startDate ; 
     while ( endOfWeek.getDayOfWeek() != DayOfWeek.SATURDAY) 
     { 
      endOfWeek = endOfWeek.plusDays(1); 
      daysInWeek.append(","); 
      daysInWeek.append(endOfWeek.getDayOfMonth()); 
     } 

     return daysInWeek.toString(); 
    } 
} 
2

Define "Неделя месяца"

Сначала вы должны уточните, что вы подразумеваете под «неделей месяца». Неделя № 1 содержит первую часть месяца? Так, когда заканчивается неделя, в воскресенье? Суббота?

Или неделя № 1, содержащая первый понедельник? Первое воскресенье?

TemporalAdjuster

The java.time классы включает в себя интерфейс для манипулирования TemporalAdjuster объекта даты и время, чтобы произвести другие.

Класс TemporalAdjusters (обратите внимание на множественное число) предоставляет несколько реализаций. Один из них - dayOfWeekInMonth, чтобы ответить на такие вопросы, как «второй вторник марта».

Внимательно прочитайте документ класса для этого регулятора.

ISO 8601

Стандарт ISO 8601 определяет разумные текстовые представления значений даты и времени. Я предлагаю вам придерживаться этого, а не самостоятельно.

Итак, вместо Dec 2016, используйте 2016-12.

В классах java.time по умолчанию используются ISO 8601. Например, класс YearMonth может непосредственно анализировать и генерировать такие значения, как 2016-12.

YearMonth ym = YearMonth.of(2016 , 12); 

... или использовать объект Month перечислимых для ясности ...

YearMonth ym = YearMonth.of(2016 , Month.DECEMBER); 

вызова toString для создания ISO 8601 отформатированной строки.

Ут: ToString(): 2016-12

YearMonth ym = YearMonth.parse("2016-12"); 

LocalDate класс представляет собой дату только значение без времени суток и без временной зоны.Объект YearMonth может дать вам LocalDate в первый и последний день месяца.

Пример

Если определить неделю-оф-месяца, как, начиная с 1-го и заканчивая в воскресенье, а затем сделать что-то вроде этого. Приращивание с каждым днем, печать каждого дня месяца. Проверяйте каждый день недели, чтобы узнать, является ли это последним днем ​​недели (по вашему собственному определению) и, следовательно, нужно перевернуть на новую строку.

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

YearMonth ym = YearMonth.parse("2016-12"); 
LocalDate firstOfMonth = ym.atDay(1); 
LocalDate lastOfMonth = ym.atEndOfMonth(); 
int nthWeek = 1; 

LocalDate ld = firstOfMonth; 
while(! ld.isAfter(lastOfMonth)) { 
    System.out.print(ld.getDayOfMonth() + ", "); 
    if(ld.getDayOfWeek().equals(DayOfWeek.SUNDAY)) { 
     System.out.println(""); // Wrap to next line. 
    } 
    ld = ld.plusDays(1); // Setup for next loop. 
} 

System.out.println("\nDone."); 

См. live code in IdeOne.com.

1, 2, 3, 4,

5, 6, 7, 8, 9, 10, 11,

12, 13, 14, 15, 16, 17, 18,

19, 20, 21, 22, 23, 24, 25,

26, 27, 28, 29, 30, 31,

Готово.

Смежные вопросы