Календарь работает в течение всего года, кроме июля

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

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

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);

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

Спасибо!


person Abraham    schedule 27.06.2019    source источник
comment
Не могли бы вы предоставить образцы входных данных? И ПОНЕДЕЛЬНИК должен быть 2, кстати.   -  person Gyro Gearless    schedule 27.06.2019
comment
В дополнение к комментарию @GyroGearless, вы случайно не установили первый день недели на любой другой день? Пример: cal.setFirstDayOfWeek(Calendar.MONDAY);   -  person Dhruvil Vaghela    schedule 27.06.2019
comment
@GyroGearless конечно! в обычный месяц он показывает вторник как 7 и среду как 1. А в июле он показывает понедельник как 7 и вторник как 1.   -  person Abraham    schedule 27.06.2019
comment
@DhruvilVaghela Действительно нет. Это единственный код, который я использую с датой. Это странно... Я не знаю, почему это происходит.   -  person Abraham    schedule 27.06.2019
comment
Я рекомендую вам не использовать SimpleDateFormat, Date и Calendar. Эти классы плохо спроектированы и давно устарели, первый из них, как известно, доставляет много хлопот. Вместо этого используйте LocalDate, DateTimeFormatter и DayOfWeek, все из java.time, современного API даты и времени Java. .   -  person Ole V.V.    schedule 29.06.2019
comment
Я не могу воспроизвести. Я попробовал 01/07/2019 (понедельник июля) и 05/08/2019 (понедельник августа). В обоих случаях я получил 2, как и ожидалось.   -  person Ole V.V.    schedule 29.06.2019
comment
То же, что и Оле В.В. говорит, но сильнее: вы должны немедленно отказаться от классов Calendar, Date и SimpleDateFormat и начать использовать более новый Java Date and Time API, доступный в пакете java.time.   -  person MC Emperor    schedule 29.06.2019
comment
@Ole VV Я наконец-то получаю стабильный результат, проблема заключалась в том, что месяц ищется в массиве (январь, февраль и т. д.), а индекс массива был на 1 меньше, чем месяц. Таким образом, у приложения на 1 месяц меньше, например: 1 января 2019 года = 01.01.2019. Но я, наконец, решаю это, изменив этот массив. Спасибо!   -  person Abraham    schedule 30.06.2019
comment
@MCEmperor Гораздо лучше использовать Java Date vefore, чем Java Calendar? Результат тот же?   -  person Abraham    schedule 30.06.2019
comment
Отлично, у тебя получилось. Чтобы получить ответ на ваш вопрос к @MCEmperor, также см. редактирование моего ответа.   -  person Ole V.V.    schedule 30.06.2019
comment
Авраам, считаешь ли ты ответом на свой вопрос? Если у вас все еще есть какие-либо сомнения, сообщите нам об этом, мы все еще здесь, чтобы помочь.   -  person Ole V.V.    schedule 08.07.2019


Ответы (3)


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

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

Вывод:

ЧЕТВЕРГ

person achAmháin    schedule 27.06.2019
comment
Привет! Но могу ли я добавить к этому объект даты? или Должен ли я создать функцию, которая делит год, месяц и день, чтобы использовать LocalDate ld = LocalDate.of(year, mont, day);? - person Abraham; 27.06.2019
comment
@Abraham Никогда не используйте классы java.util.Date или java.sql.Date. Они ужасно ошибочны, разработаны людьми, которые не понимали сложности обработки даты и времени. - person Basil Bourque; 30.06.2019

Java.время

    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);

Выход:

день недели: ПОНЕДЕЛЬНИК

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

Но могу ли я добавить к этому объект «дата»?

Иногда мы получаем старомодный объект 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.

person Ole V.V.    schedule 29.06.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
person Rowi    schedule 27.06.2019
comment
Привет! Спасибо за ответ :) Должно быть 2? Что я делаю не так? У меня есть этот код на странице jsp, и он всегда показывает мне вторник, как 7, и среду, как 1. - person Abraham; 27.06.2019
comment
Может ли быть проблема с форматом даты? В моем случае я удаляю 0 перед днем ​​и месяцем, если он меньше 10. Вот так с 07.01.2019/ по 07.01.2019. - person Abraham; 27.06.2019
comment
@Abraham, да, если понедельник, то должно быть 2 [1-7] = [воскресенье - суббота]. Возможно, вы установили для setFirstDayOfWeek какой-то другой день. - person Rowi; 28.06.2019
comment
Эти ужасные классы были вытеснены много лет назад современными классами java.time, определенными в JSR 310. Предлагать их использовать в 2019 году — плохой совет. - person Basil Bourque; 30.06.2019