Как вы сравниваете времена в Java? - PullRequest
0 голосов
/ 08 ноября 2019

Мне интересно, как бы я сравнивал время в Java-программе. Например: если я выберу временной интервал с 09:00 до 12:00 и установлю его. Если я выберу второй раз и выберу период времени 11: 00-13: 00, я бы хотел, чтобы всплывала ошибка, но я не совсем уверен, как ее настроить.

Например, если вы резервируете время в месте для массажной терапии с 9 до 12, вы не можете зарезервировать другое для себя в 11: 1, это не имеет смысла. Я пытаюсь понять, как поместить это в код. Мой уровень noob заставляет меня думать, что в качестве метода выбора есть строка, а затем проанализировать строку как целое и сравнить целое число для перекрытия? Я хочу использовать класс Date, потому что он кажется очень полезным, и я хотел бы узнать, как его использовать.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

LocalTime из java.time

    LocalTime blockStart = LocalTime.of(9, 0);
    LocalTime blockEnd = LocalTime.of(12, 0);
    assert blockEnd.isAfter(blockStart);

    LocalTime newBlockStart = LocalTime.of(11, 0);
    LocalTime newBlockEnd = LocalTime.of(13, 0);
    assert newBlockEnd.isAfter(newBlockStart);

    if (newBlockStart.isBefore(blockEnd) && newBlockEnd.isAfter(blockStart)) {
        System.out.println("" + newBlockStart + '–' + newBlockEnd
                + " overlaps with " + blockStart + '–' + blockEnd);
    }

Вывод из фрагмента:

11: 00–13: 00 перекрывается с 09: 00–12: 00

A LocalTime - это время суток без даты. Потенциальная ответственность заключается в том, что она не может принять во внимание, повернуты ли часы вперед или назад, например, когда начинается или заканчивается летнее время (DST). Но если вы не хотите ничего такого фантастического, это правильный класс для использования.

Формула для обнаружения перекрытия является стандартной. Я включаю ссылку на вопрос об этом ниже.

Я хочу использовать класс Date, хотя ...

Не, пожалуйста, не надо«т. Date плохо спроектирован и давно устарел. Вы серьезно не учитесь использовать этот класс. Научитесь использовать java.time, современный Java API даты и времени. Возможное место для начала - первая ссылка ниже.

Ссылки

0 голосов
/ 08 ноября 2019

Допустим, у вас есть ограниченное время, в течение которого вы должны создать временной блок по любой причине. Давайте преобразуем эти ограничивающие времена в фактические объекты Date в Java. Я использую

Date today = new Date();

, чтобы получить сегодняшнюю дату, вы можете использовать любой день, какой захотите.
Затем я объединяю сегодняшнюю дату (день месяца года) со временем, которое я определил, в двух строках, ночто вы можете получить от объекта и т. д.

private static Date combineDates(Date date, Date time) {
    Calendar cal = Calendar.getInstance();

    cal.setTime(time);
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int min = cal.get(Calendar.MINUTE);

    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, min);

    return cal.getTime();
}


Date today = new Date();
SimpleDateFormat isoTime = new SimpleDateFormat("HH:mm", Locale.US);

String startTimeString =  "09:00";
String endTimeString =  "12:00";

Date startTime = new Date();
Date endTime = new Date();

try {
    startTime = isoTime.parse(startTimeString);
    endTime = isoTime.parse(endTimeString);
} catch (ParseException e){
    Log.e(TAG, e.getMessage());
}

Date startDate = combineDates(today, startTime);
Date endDate = combineDates(today, endTime);

С этого момента единственное, что остается сделать, - это получить второй выбранный период времени и сравнить его с ограничивающими временами.

Что-то вроде:

if (newDateStart.after(startDate) && newDateEnd.before(endDate)) {
// Allow user to choose time
} else {
// Do not allow user to choose time
}

Я уверен, что это немного запутанно, но это лучшее, что у меня есть сейчас. Также обратите внимание, что есть более новые объекты Java, которые вы можете использовать, но это будет работать с большинством API Android, так что ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...