Есть ли функция для обеспечения первого дня месяца?
В Java я могу получить первый день месяца следующим образом:
GregorianCalendar date;
// Some code
int first = new GregorianCalendar(date.get(Calendar.YEAR),
date.get(Calendar.MONTH), 1).get(Calendar.DAY_OF_WEEK);
Мне интересно, есть ли функция, которая делает это напрямую, потому что я не могу найти функцию, которая захватывает эту важную информацию.
Нечто похожее на то, что я пытаюсь сделать здесь:
for (int i = 1; i < days_in_month + first; i++) {
// Some code
if (i - first + 1 == date.get(Calendar.DAY_OF_MONTH)) {
// Do something
}
}
3 ответа
Проще говоря, нет. Это правильный способ получить что-то подобное.
Это буквально функциональность, которую они вставили в Java для выполнения подобных вычислений. Любая "прямая функция" просто делает это внутренне (что я предлагаю вам сделать).
Вы можете конвертировать GregorianCalendar
возражать против LocalDate
возьмите и используйте удобный API:
LocalDate getWithFirstDayOfMonth(GregorianCalendar c) {
LocalDate date = c.toZonedDateTime().toLocalDate();
return date.withDayOfMonth(1);
}
GregorianCalendar calendar = GregorianCalendar.from(ZonedDateTime.now());
LocalDate first = getWithFirstDayOfMonth(calendar);
System.out.println(first.getDayOfMonth());
ТЛ; др
Чтобы получить целое число, представляющее день недели (1-7 для понедельника-воскресенья), для первого дня текущего года-месяца:
myGregCal // Avoid troublesome legacy date-time classes such as `GregorianCalendar`.
.toZonedDateTime() // Convert from legacy class to modern java.time class, a `ZonedDateTime` object.
.toLocalDate() // Extract a date-only object.
.with( TemporalAdjusters.firstDayOfMonth() ) // Adjust into first day of the same year-month.
.getDayOfWeek() // Extract a `DayOfWeek` enum object for Monday, Tuesday, etc. Consider using this object directly rather than taking the next step to extract a `int` number.
.getValue() // Extract an `int` integer number, 1-7 for Monday-Sunday.
... дает номер 1-7 для понедельника-воскресенья.
Совет: лучше пропустить последний шаг и использовать DayOfWeek
объект вместо int
:
myGregCal.toZonedDateTime().toLocalDate().with( TemporalAdjusters.firstDayOfMonth() ).getDayOfWeek() // Render a `DayOfWeek` enum object.
java.time
Ответ Александра может быть правильным, и он выигрывает очки за использование современных классов java.time, а не устаревших классов даты-времени. Но есть более простой подход к такому коду. Кроме того, Вопрос, кажется, хочет пойти еще дальше, чтобы получить день недели для первого месяца.
По комментарию Андреаса, вы можете позвонить GregorianCalendar::toZonedDateTime
как простой способ перейти от старого унаследованного класса GregorianCalendar
к современному ZonedDateTime
учебный класс. Старые классы получили новые методы для облегчения конвертации между унаследованными классами и современными классами java.time.
ZonedDateTime zdt = myGregCal.toZonedDateTime() ; // Convert from legacy class to modern class.
Оттуда извлечь LocalDate
объект. LocalDate
класс представляет значение только для даты без времени суток и без часового пояса.
LocalDate ld = zdt.toLocalDate() ;
Установите значение для первого дня того же месяца. Использовать TemporalAdjuster
реализация найдена в TemporalAdjusters
учебный класс.
LocalDate firstOfMonth = ld.with( TemporalAdjusters.firstDayOfMonth() ) ;
Определите день недели для этой даты первого месяца с помощью DayOfWeek
Перечислить объект. Это перечисление предварительно определяет 7 объектов, по одному на каждый день недели: понедельник, вторник и т. Д.
DayOfWeek dow = firstOfMonth.getDayOfWeek() ;
Рассмотрите возможность использования этого DayOfWeek
enum объект вместо простого неуклюжего int
номер для представления вашего дня недели. Использование объектов, а не int
Примитив делает ваш код более самодокументированным, обеспечивает безопасность типов и обеспечивает допустимые значения.
Но если вы настаиваете, вы можете извлечь int
1-7 для понедельника-воскресенья по стандарту ISO 8601.
int dowNumber = dow.getValue() ;
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date
, Calendar
, GregorianCalendar
& SimpleDateFormat
,
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Где взять классы java.time?
- Java SE 8, Java SE 9 и более поздние
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.