Календарь работы в течение всего года, кроме июля - PullRequest
0 голосов
/ 27 июня 2019

У меня есть приложение, которое использует календарь, и мне нужно выбрать день недели.Проблема в том, что он принимает правильный день недели во всех датах года, кроме июля.

Я пытался добавлять разные даты в течение всего года, но эта проблема возникает только в июле.

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(fechaaux);
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

Если fechaux в понедельник августа, это возвращает 6 (это нормально), но если я добавлю дату в понедельник июля, это вернет 7, когда это должно показать 6. Почему это происходит?Я никогда не видел этого раньше.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 27 июня 2019

Если вы можете использовать фактический день недели - рассмотрите возможность использования LocalDate (Java 8+), если возможно:

LocalDate ld = LocalDate.of(2019, 6, 27);
System.out.println(ld.getDayOfWeek());

Вывод:

ЧЕТВЕРГ

2 голосов
/ 29 июня 2019

java.time

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/u");
    String fechaaux = "01/07/2019";
    LocalDate date = LocalDate.parse(fechaaux, formatter);
    DayOfWeek dayOfWeek = date.getDayOfWeek();

    System.out.println("dayOfWeek: " + dayOfWeek);

Вывод:

dayOfWeek: MONDAY

Вам следует избегать использования SimpleDateFormat, Dateи Calendar.Хотя я не знаю, что пошло не так в вашем коде, эти классы давно устарели и плохо разработаны.Вместо этого я рекомендую java.time, современный Java API даты и времени.С ним гораздо приятнее работать.

Но можно ли добавить к этому объект "дата"?

Иногда мы получаем старомодный Dateобъект из API, который мы не хотим обновлять прямо сейчас.В этом случае возможное преобразование:

    ZonedDateTime zdt
            = oldfashionedDate.toInstant().atZone(ZoneId.systemDefault());
    DayOfWeek dayOfWeek = zdt.getDayOfWeek();

Редактировать:

Гораздо лучше использовать Java Date до того, как Java Calendar?Результат одинаковый?

Вам следует избегать обоих.Только если вы получаете один из них от унаследованного API, который вы не можете изменить, примите то, что вы получите, и сначала преобразуйте его в современный тип.Если вы получите Date, используйте приведенное выше преобразование.Если вы получите Calendar, вы можете быть уверены, что это GregorianCalendar.Если это так:

    ZonedDateTime zdt = ((GregorianCalendar) theCalendarYouGot).toZonedDateTime();

Теперь действуйте, как описано выше.

Исторически Calendar и GregorianCalendar были представлены как (несколько неудачная) попытка компенсировать проблемы проектирования с Date.

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 27 июня 2019

DAY_OF_WEEK - это не день недели, это число от 1 до 7, если это воскресенье, вернется 1 и т. Д.

В этом случае, если это в понедельник, вернется 2,

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
Date date = formatter.parse("01/07/2019"); 
Calendar c = Calendar.getInstance(); 
c.setTime(date); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
System.out.println(dayOfWeek);

Out Put:2
...