ТЛ; др
как найти текущий день недели
DayOfWeek.from( LocalDate.now() )
настроить расписание на неделю
LocalDate sunday =
LocalDate.now()
.with( TemporalAdjusters.nextOrSame( DayOfWeek.SUNDAY ) ) ;
LocalDate monday = sunday.plusDays( 1 ) ;
LocalDate tuesday = monday.plusDays( 1 ) ;
…
Подробнее
В Вопросах и других ответах используются устаревшие классы.
Старые классы даты и времени плохо разработаны, сбивают с толку и создают проблемы. Избежать их.
java.time
В Java 8 и более поздних версиях мы используем встроенную инфраструктуру java.time. Большая часть функциональности перенесена в Java 6 & 7 (ThreeTen-Backport) и дополнительно адаптирована для Android (ThreeTenABP).
Instant
представляет текущий момент в UTC с разрешением до наносекунд.
Instant instant = Instant.now();
Чтобы получить день недели, мы должны определить дату. Часовой пояс имеет решающее значение при определении даты, так как дата может меняться по всему земному шару в любой данный момент. Например, через несколько минут после полуночи в Париже - новый день, а в Монреале - все еще «вчера».
Используйте ZoneId
для представления часового пояса. Запросите правильное название часового пояса в формате continent/region
. Никогда не используйте 3-4-буквенные сокращения, обычно встречающиеся в основных средствах массовой информации, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Используйте удобное перечисление DayOfWeek
для определения дня недели.
DayOfWeek dow = DayOfWeek.from( zdt );
Вы можете опросить объект DayOfWeek
.
Вы можете запросить номер от 1 до 7, где 1 - понедельник, а 7 - воскресенье по стандарту ISO 8601 . Но не передавайте этот номер вокруг вашего кода; вместо этого передайте вокруг DayOfWeek
объекты, чтобы воспользоваться преимуществами безопасности типов и гарантированно допустимых значений.
int dowNumber = dow.getValue();
Возможно, вам понадобится текст, название дня недели. Пусть java.time автоматически переведет имя на человеческий язык. A Locale
видов, которые человеческий язык, а также определяет культурные нормы для использования, такие как, как сокращать и использовать заглавные буквы. Перечисление TextStyle
указывает, какое длинное имя вы хотите.
Locale locale = Locale.CANADA_FRENCH;
String output = dow.getDisplayName( TextStyle.FULL , locale );
Чтобы получить начало недели, попросите предыдущий понедельник (или воскресенье и т. Д.) Или придерживайтесь сегодняшнего дня, если это понедельник. Используйте TemporalAdjuster
реализацию, найденную в TemporalAdjusters
class.
LocalDate startOfWeek = zdt.toLocalDate().with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
Если вам нужна дата-время, а не только дата, попросите java.time получить первый момент дня (не всегда время 00:00:00
).
ZonedDateTime zdtWeekStart = startOfWeek.atStartOfDay( zoneId );
О java.time
Платформа java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
* * T тысяча сто семьдесят-двеПроект
ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как
Interval
,
YearWeek
,
YearQuarter
и
more .