Избегайте унаследованную даты и время занятия
старые 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.
Большое вам спасибо! Меня так ценят, что вы дали такой большой и подробный ответ. Тем не менее, я просто новичок, некоторые коды выше для меня совершенно новые ... но я постараюсь выяснить, что они собой представляют. Благодаря! – chunyuen2
@ 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' специально. –
@BasilBourquean Могу ли я использовать это при написании приложения для Android? Поскольку я учусь писать приложение Android, используя студию Android, и большая часть кода основана на языке 'java'. – chunyuen2