есть ли функция в java или как я могу сгенерировать срок выполнения с учетом графика работы с начальной даты - PullRequest
0 голосов
/ 06 мая 2020

Пример

Срок сдачи - 15 минут

Расписание

Пн - Пт: 7:30 - 17:00

Сб 9:00 - 14:00

Вс 10:00 - 13:00

Если моя начальная дата (IniDate) - понедельник в 6:00, срок оплаты будет понедельник в 7:45, и если мой IniDate будет в понедельник в 8:00, мой срок будет в понедельник в 8:15, но если мой IniDate будет в понедельник в 16:50, мой срок будет во вторник в 7:35, потому что у меня было 10 минут с понедельника и 5 минут со следующего дня, также, если мой IniDate будет в понедельник в 18:00, мой срок будет во вторник в 7:45, работая в java в Talend Open Studio для интеграции данных будут использоваться фактические даты, что означает, что, допустим, мой IniDate был 05.05.2020 18:00, тогда мой срок сдачи будет 06.05.2020 7:45, с учетом расписания, это мой первый вопрос, пытаюсь использовать его в компоненте tMap в разделе переменных посередине, спасибо

1 Ответ

0 голосов
/ 06 мая 2020

Представьте свое рабочее время как Duration.

  Duration dueTime = Duration.ofMinutes(15);

Представьте свое расписание как EnumMap<DayOfWeek, DailySchedule>, где DailySchedule - это класс, который вы пишете для ежедневного времени открытия и закрытия. Внутри класса время представлено как LocalTime объектов. Класс, вероятно, будет иметь методы для определения того, находится ли данное время дня до, в пределах или после интервала расписания.

Желательно представить ваше начальное время 18:00 05.05.2020 как ZonedDateTime в соответствующий часовой пояс (LocalDateTime тоже может работать, но на самом деле не подходит для этой цели).

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

Первый снимок в установленный срок и время - это скорректированные дата и время плюс в свое время. ZonedDateTime имеет метод plus, который принимает Duration. Теперь, если срок оплаты наступает на следующий день или позже сегодняшнего времени закрытия, это неверно. В этом случае используйте Duration.between, чтобы вычислить, сколько времени вы можете занять в день (10 минут в вашем примере). Вычтите это из положенного времени (Duration.minus()). Теперь приступим к работе на следующий день. Проверку действительно следует проводить в al oop, чтобы учесть, что ежедневный график может быть короче положенного времени. Если расписание на субботу 09: 00–09: 05 и воскресенье 10: 00–10: 05, нам, возможно, придется переключаться с пятницы на понедельник, прежде чем мы найдем правильную дату и время.

Duration, DayOfWeek, LocalTime и ZonedDateTime все принадлежат java .time, современному Java API даты и времени. Ссылка на руководство внизу.

Удачного кодирования.

Позднее редактирование: код

Я мог бы сделать это следующим образом:

    Map<DayOfWeek, DailySchedule> weeklySchedule = new EnumMap<>(DayOfWeek.class);
    DailySchedule weekdaySchedule
            = new DailySchedule(LocalTime.of(7, 30), LocalTime.of(17, 0));
    for (DayOfWeek dow = DayOfWeek.MONDAY;
            dow.getValue() <= DayOfWeek.FRIDAY.getValue(); dow = dow.plus(1)) {
        weeklySchedule.put(dow, weekdaySchedule);
    }
    weeklySchedule.put(DayOfWeek.SATURDAY,
            new DailySchedule(LocalTime.of(9, 0), LocalTime.of(14, 0)));
    weeklySchedule.put(DayOfWeek.SUNDAY,
            new DailySchedule(LocalTime.of(10, 0), LocalTime.of(13, 0)));

    Duration dueTime = Duration.ofMinutes(15);

    // Set initial day and time
    DayOfWeek currentDay = DayOfWeek.MONDAY;
    LocalTime currentTime = LocalTime.of(16, 50);
    Duration remainingTimeToAdd = dueTime;

    DailySchedule todaysSchedule = weeklySchedule.get(currentDay);
    if (todaysSchedule.isBeforeOpen(currentTime)) {
        currentTime = todaysSchedule.getOpen();
    } else if (todaysSchedule.isOnOrAfterClose(currentTime)) {
        currentDay = currentDay.plus(1);
        todaysSchedule = weeklySchedule.get(currentDay);
        currentTime = todaysSchedule.getOpen();
    }
    // We will break this loop explicitly when done
    while (true) {
        // Can time be added today?
        LocalTime candidateDueTime = currentTime.plus(remainingTimeToAdd);
        if (todaysSchedule.isWithinSchedule(candidateDueTime)) {
            // yes, done
            currentTime = candidateDueTime;
            break;
        } else {
            // take remainder of today and continue tomorrow
            remainingTimeToAdd = remainingTimeToAdd.minus(Duration.between(currentTime, todaysSchedule.getClose()));
            currentDay = currentDay.plus(1);
            todaysSchedule = weeklySchedule.get(currentDay);
            currentTime = todaysSchedule.getOpen();
        }
    }

    System.out.println("Due day and time: " + currentDay + " at " + currentTime);

Вывод из пример:

Дата и время сдачи: ВТОРНИК в 07: 35

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

Ссылка

Oracle учебник: Дата Время объясняет, как использовать java .time.

...