Селен добавляет дни недели к дате, дни выходных не рассчитываются правильно - PullRequest
0 голосов
/ 06 июля 2018

Я использую приведенный ниже код на 6/7/2018, чтобы исключить выходные дни для любых возвращаемых дат. Однако код, похоже, определяет следующие дни как выходные.

13/7/2018 - Friday & 14/7/2018 - Saturday

вместо

14/7/2018 - Saturday & 15/7/2018 - Sunday

Я обновляю указанное поле, чтобы увеличить / уменьшить количество дней в будущем, которое я хочу выбрать.

Если я введу 5 дней, возвращаемая дата будет 12/7/2018, а если я введу 6 дней, возвращаемая дата будет 15/7/2018.

Есть ли что-то очевидное, чего мне не хватает, любая помощь будет высоко оценена.

Date date=new Date();
Calendar calendar = Calendar.getInstance();
date=calendar.getTime(); 
SimpleDateFormat s;
s=new SimpleDateFormat("dd/MM/yyyy");

System.out.println(s.format(date));

int days = 5; //I am updating this value to increase and decrease days
for(int i=0;i<days;)
{
    calendar.add(Calendar.DAY_OF_MONTH, 1);

    //here even sat and sun are added
    //but at the end it goes to the correct week day.
    //because i is only increased if it is week day

    if(calendar.get(Calendar.DAY_OF_WEEK)<=5)
    {
        i++;
    }

}
date=calendar.getTime(); 
s=new SimpleDateFormat("dd/MM/yyyy");
System.out.println(s.format(date));

1 Ответ

0 голосов
/ 08 июля 2018
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(Locale.UK);
    LocalDate date = LocalDate.now(ZoneId.of("Pacific/Truk"));
    System.out.println(date.format(dateFormatter));
    int days = 5;

    int i = 0;
    while (i < days) {
        date = date.plusDays(1);
        DayOfWeek day = date.getDayOfWeek();
        if (! day.equals(DayOfWeek.SATURDAY) && ! day.equals(DayOfWeek.SUNDAY)) {
            i++;
        }
    }
    System.out.println(date.format(dateFormatter));

Выходной сегодня (воскресенье, 8 июля):

08/07/2018
13/07/2018

13 июля - следующая пятница, поэтому очевидно, что пятница не была выходной.

есть что-то очевидное, чего мне не хватает (?)

Не думаю, что это так очевидно: класс Calendar нумерует дни недели с 1 по воскресенье до 7 по субботу.Это происходит из американского понимания недель.Поэтому, когда вы решили, что день недели должен быть меньше или равен 5, вы включили воскресенье (1) - четверг (5) и отфильтровали пятницу (6) и субботу.

…если бы вы могли указать мне правильное направление на документацию ...

Чтобы найти эту информацию в документации, вам нужно было бы искать под каждой константой день недели, SUNDAY и т. д., иперейдите по ссылке Постоянные значения полей.См. Ссылки внизу этого ответа.

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

Одна из многих проблем с Calendar - это использование int для дня недели (и других элементов, которые имеют имена, а не числа).Это неестественно и очень легко спутать.Можно сказать, что вы усилили проблему, сравнив ее с 5, а не с Calendar.FRIDAY, но из-за американской нумерации последняя также не решила бы вашу проблему.java.time 's DayOfWeek является перечислением и не приглашает для сравнения, используя «меньше чем» или «есть раньше» (хотя вы можете, и это будет работать в вашем случае).Код, ссылающийся на именованные константы SATURDAY и SUNDAY, не только понятнее, но и менее подвержен ошибкам.

Links

...