Java: получение текущего значения дня недели - PullRequest
5 голосов
/ 11 марта 2010

В данный момент я создаю приложение java schedule и мне было интересно, как найти текущий день недели при использовании класса Calendar, чтобы получить первый день недели.

Вот метод, который я использую в классе для настройки расписания на неделю

public static String getSunday() {
    SimpleDateFormat d = new SimpleDateFormat(dayDate);
    Calendar specific = cal;
    specific.add(Calendar.DAY_OF_YEAR, (cal.getFirstDayOfWeek() - ??));
    return d.format(specific.getTime());
}

Ответы [ 2 ]

6 голосов
/ 11 марта 2010

Вы можете узнать текущий день недели, позвонив get() с Calendar.DAY_OF_WEEK

public int getTodaysDayOfWeek() {
  final Calendar c = Calendar.getInstance();
  return c.get(Calendar.DAY_OF_WEEK);
}

Кроме того, хотя я не уверен, что точно понимаю, что вы пытаетесь сделать, мне это кажется подозрительным. (Что такое cal например?)

2 голосов
/ 20 июня 2016

ТЛ; др

как найти текущий день недели

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 .
...