java - شرح - كتابة برنامج بلغة جافا يطلب من المستخدم علامة طالب




مقارنة الوقت غير صحيحة عند اختيار 12:00 (2)

أقوم بإنشاء نظام حجز ولا أريد السماح للمستخدمين بالحجز في وقت البدء من الساعة 11:00 ووقت الانتهاء من الساعة 09:00 (الماضية) (أستخدم على مدار الساعة). لدي صندوقي تحرير وسرد مملوءين بسلسلة تعمل كوقت بداية ونهاية (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 ، فسيتم إخراج البرنامج fail2 (إخراج جيد) ،

إذا اخترت وقت البدء 09:00 ووقت الانتهاء 12:00 ، فسيتم إخراج البرنامج fail2 (يجب أن يكون test1) ،

إذا اخترت وقت البدء 12:00 ووقت الانتهاء 10:00 ، فسيقوم البرنامج بإخراج test1 (يجب أن يكون fail2) ،

إذا اخترت وقت البدء 12:00 ووقت الانتهاء 15:00 ، فسيقوم البرنامج بإخراج test1 (إخراج جيد)

يحدث هذا النوع من المشاكل فقط عندما أختار 12:00 ..


يجب عليك استخدام HH:mm .

يتراوح hh 01-12 ، بينما يتراوح HH 1-23 .

تحديث

تحقق من doc SimpleDateFormat :

H: ساعة في اليوم (0-23)

h: الساعة من صباحًا / مساءً (1-12)


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 يوزع السلاسل دون الحاجة إلى تنسيق واضح. علاوة على ذلك ، إذا كنت تثق في أن combobox الخاص بك يحتوي فقط على سلاسل زمنية صالحة ، فيمكنك تجاهل إنشاء try - catch لأن DateTimeParseException هو استثناء لم يتم التحقق منه.

إذا كان startTime و endTime هما endTime ، فأعتقد أنه يمكنك ملء كائنات LocalTime بها. ثم لا تحتاج إلى تحليل عندما يختار المستخدم واحدة من كل منها. سوف يتصل 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);

تكشفت:

أنا أستخدم LocalTime من java.time ، واجهة برمجة تطبيقات التاريخ والوقت لـ Java الحديثة. عادة ما يكون java.time أجمل كثيرًا في العمل مع فصول التاريخ والوقت القديمة والقديمة مثل SimpleDateFormat و Date والمزيد.

الرابط: Oracle تعليمي: Date Time يشرح كيفية استخدام java.time .







simpledateformat