2017-01-04 8 views
0

Я сделал счетчик для выбора определенного месяца, затем я также создал флажок для выбора определенных дней, и как я могу показать все даты после выбора такой информации?Android: как получить все даты месяца после выбора определенного месяца и рабочих дней?

E.g. Если я выбираю январь и выбираю понедельники и среды, как я могу показать все даты понедельника: 2/1,9/1 /, 16/1,23/1,30/1 и среды: 4/1,11/1 , 18/1,25/1 соответственно?

Я с нетерпением жду ответа от вас! Благодаря!

ответ

0

Избегайте унаследованную даты и время занятия

старые Date и Calendar классы оказались запутанными, ошибочными и хлопотными. Теперь наследие, вытесненное классами java.time в Java 8 и более поздних версиях. См. Ниже ссылки на back-ports для более ранней Java и Android.

Использования java.time

Данных за ваши которые-дни-оф-недель флажков может быть представлен с помощью DayOfWeek перечисления. Этот класс предоставляет семь экземпляров, по одному на каждый день недели, понедельник-воскресенье.

Вы можете получить желаемые дни пользователя в EnumSet, специальную высоко оптимизированную реализацию Set для объектов Enum.

Set<DayOfWeek> daysOfWeek = EnumSet.noneOf(DayOfWeek.class); 
daysOfWeek.add(DayOfWeek.MONDAY); 
daysOfWeek.add(DayOfWeek.WEDNESDAY); 

Запомнить выбранный месяц и год, используя YearMonth объект.

YearMonth ym = YearMonth.of(2017 , Month.JANUARY); // Or (2017 , 1) for January. 

Получить первую дату этого месяца, представленного в качестве LocalDate. Класс LocalDate представляет собой значение даты только без времени и без часового пояса.

LocalDate firstOfMonth = ym.atDay(1); 

Петля каждый день в нашей коллекции. Для каждого определите первое появление месяца. Java обеспечивает удобную реализацию TemporalAdjuster, найденную в TemporalAdjusters для этого первого вхождения. Затем добавьте неделю за раз, пока мы не окажемся в следующем месяце.

for (DayOfWeek dayOfWeek : daysOfWeek) { 
    List<LocalDate> dates = new ArrayList<> (5); 
    LocalDate ld = firstOfMonth.with (TemporalAdjusters.dayOfWeekInMonth (1 , dayOfWeek)); 
    do { 
     dates.add (ld); 
     // Set up next loop. 
     ld = ld.plusWeeks (1); 
    } while (YearMonth.from (ld).equals (ym)); // While in the targeted month. 
    System.out.println ("ym.toString(): " + ym + " | dayOfWeek.toString(): " + dayOfWeek + " | dates: " + dates); 
} 

ym.toString(): 2017-01 | dayOfWeek.toString(): ПОНЕДЕЛЬНИК | даты: [2017-01-02, 2017-01-09, 2017-01-16, 2017-01-23, 2017-01-30]

ym.toString(): 2017-01 | dayOfWeek.toString(): СРЕДА | даты: [2017-01-04, 2017-01-11, 2017-01-18, 2017-01-25]

См. this code live in IdeOne.com.


О java.время

Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

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

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

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

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

+0

Большое вам спасибо! Меня так ценят, что вы дали такой большой и подробный ответ. Тем не менее, я просто новичок, некоторые коды выше для меня совершенно новые ... но я постараюсь выяснить, что они собой представляют. Благодаря! – chunyuen2

+0

@ chunyuen2 Вы можете прочитать [Учебник Oracle по Enum] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Перечисления на Java гораздо более мощные и полезные, чем простые перечисления, найденные на других языках. И прочитайте [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/collections/intro/), если вы новичок в коллекциях вообще и 'Set' /' List' специально. –

+0

@BasilBourquean Могу ли я использовать это при написании приложения для Android? Поскольку я учусь писать приложение Android, используя студию Android, и большая часть кода основана на языке 'java'. – chunyuen2

1

С помощью этого метода вы можете

private String getMondaysOfJanuary() 

     Calendar cal = Calendar.getInstance(); 
     cal.set(Calendar.MONTH, Calendar.JANUARY); // month starts by 0 = january 
     cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
     cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); 
     int month = cal.get(Calendar.MONTH); 
     String output = ""; 
     while (cal.get(Calendar.MONTH) == month) { 
      output += cal.get(Calendar.DAY_OF_MONTH) + "/" + (cal.get(Calendar.MONTH)+1) + ","; 
      cal.add(Calendar.DAY_OF_MONTH, 7); 
     } 
     return output.substring(0, output.length-1); 
} 

Заменив эти две строк с данными за вами и параметризующие этот метод, вы можете достичь своей цели

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); 
+0

Большое спасибо! Я просто новичок, поэтому мне может понадобиться некоторое время, чтобы понять код. – chunyuen2

+0

@ chunyuen2 Имейте в виду, что класс «Календарь» очень запутан и плохо разработан. По многим причинам он теперь вытесняется классом «ZonedDateTime» и другими классами java.time. Как новичок, не смотрите на «Календарь» как пример хорошего объектно-ориентированного программирования; это скорее пример того, что * не * делать. –

+0

@BasilBourque Поистине, я очень смущен. – chunyuen2