Неверное время сравнения при выборе 12:00 - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю систему бронирования и не хочу, чтобы пользователи могли бронировать с начальным временем 11:00 и конечным временем 09:00 (в прошлом) (я использую 24-часовые часы). У меня есть два поля со списком, заполненные строками, которые действуют как время начала и окончания (09: 00,10: 00,11: 00,12: 00,13: 00 ....)

У меня есть этот код:

 String start = (String) startTime.getSelectedItem();
        String end = (String) endTime.getSelectedItem();
        try {
            if(new SimpleDateFormat("hh:mm").parse(start).before(new SimpleDateFormat("hh:mm").parse(end))){
                System.out.println("test1");// future date - good

            }else{
                System.out.println("fail2");// old date - bad
            }
        } catch (ParseException ex) {
                System.out.println("error");
        }

Это работает отлично, за исключением случаев, когда я выбираю время начала / окончания 12:00. Программа выводит данные, противоположные тому, что предполагается выводить, и я не уверен, почему.

Если я выберу время начала 14:00 и время окончания 12:00, программа выдаст сбой 2 (хороший вывод), * ​​1008 *

Если я выберу время начала 09:00 и время окончания 12:00, программа выдаст ошибку fail2 (должно быть test1),

если я выберу время начала 12:00 и время окончания 10:00, программа выдаст test1 (должно быть fail2),

если я выберу время начала 12:00 и время окончания 15:00, программа выдаст test1 (хороший вывод)

Этот тип проблемы возникает только тогда, когда я выбираю 12:00 ..

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018
String start = (String) startTime.getSelectedItem();
        String end = (String) endTime.getSelectedItem();
        SimpleDateFormat timer = new SimpleDateFormat("HH:mm");

        try {
            Date startD = timer.parse(start);
            Date endD = timer.parse(end);
            if(startD.before(endD)){
                System.out.println("test1");// future date - good
            }else{
                System.out.println("fail2");// old date - bad
            }
        } catch (ParseException ex) {
                System.out.println("error");
    }

Изменение моего кода для исправления этой проблемы ..

0 голосов
/ 26 апреля 2018
public static void checkTimes(String start, String end) {
    try {
        if (LocalTime.parse(start).isBefore(LocalTime.parse(end))) {
            System.out.println("test1");// future date - good
        } else {
            System.out.println("fail2");// old date - bad
        }
    } catch (DateTimeParseException dtpe) {
        System.out.println("error");
    }
}

Давайте попробуем:

    checkTimes("14:00", "12:00");
    checkTimes("09:00", "12:00");
    checkTimes("12:00", "10:00");
    checkTimes("12:00", "15:00");

Это печатает:

fail2
test1
fail2
test1

Я считаю, что это согласуется с тем, что вы намеревались. Обратите внимание, что LocalTime анализирует ваши строки без необходимости явного средства форматирования. Кроме того, если вы уверены, что ваш комбинированный список содержит только допустимые строки времени, вы можете пропустить конструкцию try - catch, поскольку DateTimeParseException является непроверенным исключением.

Если startTime и endTime равны JComboBox, я считаю, что вы даже можете заполнить LocalTime объектами. Тогда вам не нужно анализировать, когда пользователь выбирает один из каждого. Ваш JComboBox вызовет LocalTime.toString(), который вернет строку типа 09:00, которая в свою очередь отобразит поле со списком и позволит пользователю выбрать.

    LocalTime[] times = { LocalTime.of(9, 0), LocalTime.of(10, 0), LocalTime.of(11, 0), 
                          LocalTime.of(12, 0), LocalTime.of(13, 0), LocalTime.of(14, 0) };
    JComboBox<LocalTime> combo = new JComboBox<>(times);

Combo

разложенном:

Combobox unfolded

Я использую LocalTime из java.time, современный Java-интерфейс даты и времени. java.time, как правило, гораздо приятнее работать, чем старые и устаревшие классы даты и времени, такие как SimpleDateFormat, Date и другие.

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

0 голосов
/ 26 апреля 2018

Вы должны использовать HH:mm.

hh диапазонов 01-12, а HH диапазонов 1-23.

Обновление

Проверьте документ из SimpleDateFormat:

Ч: Час в день (0-23)

ч: час в час / час (1-12)

...