Объект григорианского календаря для сопоставления дат внутри ArrayList - PullRequest
0 голосов
/ 11 января 2019

Я создаю григорианский календарь внутри метода filterBookings (), который должен создать внутри него григорианский календарь, чтобы он соответствовал датам, которые вводит пользователь (получить выбранный элемент из 3 отдельных ComboBox, называемых cmbYear, cmbMonth и cmbDay ). МассивList называется FilterBookings в настоящее время создается глобально. Если даты совпадают с индексом соответствующего бронирования, его следует добавить в список данных. Входные данные уже упомянуты в коде. На панели вывода написано: «Непарсируемая дата». Кто-нибудь может помочь? Я новичок в этом и не имею фона по этому :(

 ArrayList <GregorianCalendar> filteredBookings = new ArrayList<>();
 public PhotoshootManager() throws ParseException {
     initComponents();
     filterBookings();
 }

 public void filterBookings(){   
     GregorianCalendar cal = new GregorianCalendar();

     String getYear =(String) (cmbYear.getSelectedItem());
     String getMonth =(String) (cmbMonth.getSelectedItem());
     String getDay =(String) (cmbDay.getSelectedItem());

     DateFormat setCal = new SimpleDateFormat("dd/MM/yyyy");  
     Calendar cal = Calendar.getInstance();

     try {
         Date date = setCal.parse(getDay+ "/" + getMonth +"/" + getYear);
     } catch (ParseException ex) {

         Logger.getLogger(PhotoshootManager.class.getName()).log(Level.SEVERE, 
                 null, ex);
     }
 }

Это школьный проект, и, к сожалению, мы должны использовать старый GregorianCalendar класс.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вероятно, один из

 String getYear =(String) (cmbYear.getSelectedItem());
 String getMonth =(String) (cmbMonth.getSelectedItem());
 String getDay =(String) (cmbDay.getSelectedItem());

Ноль, вы также указали недопустимый месяц монтирования или день, не используйте исключение, например, здесь:

        public static void filterBookings(){   
           String getYear ="20192525";
           String getMonth ="4444444444";
           String getDay ="1132632626";



            DateFormat setCal = new SimpleDateFormat("dd/MM/yyyy");  

             try {
                 Date date = setCal.parse(getDay+ "/" + getMonth +"/" + getYear);
                 System.out.println(date);
             } catch (ParseException ex) {

              System.out.println("ko");
             }
           }
    }

вывод:

Thu Sep 19 00:00:00 CEST 35749996
0 голосов
/ 12 января 2019

Избегайте устаревших классов даты и времени

Вы используете ужасные старые классы даты и времени, которые были вытеснены годами назад современными java.time классами.

ZonedDateTime

В частности, класс GregorianCalendar заменяется на ZonedDateTime. Этот класс представляет момент, точку на временной шкале как дату, время дня и часовой пояс.

Но ZonedDateTime не подходит для планирования будущих встреч. Вместо этого мы должны отделить дату и время от часового пояса при бронировании будущих встреч. Более подробное объяснение ниже.

LocalDate

Преобразуйте ваши строковые значения для года, месяца и дня в числа.

int y = Integer.parseInt( year ) ;
int m = Integer.parseInt( month ) ;
int d = Integer.parseInt( day ) ;

Создание экземпляра LocalDate. Класс LocalDate представляет значение только для даты без времени суток и без часового пояса или смещения от UTC .

LocalDate ld = LocalDate.of( y , m , d ) ;

LocalDateTime

Ваш Booking класс должен иметь LocalDateTime переменную-член. В этом классе намеренно отсутствует понятие часовой пояс или смещение от UTC . Мы используем это для будущих назначений, потому что политики по всему миру часто меняют смещение своего часового пояса. Часто они делают это практически без предупреждения. Для назначений, таких как «3 часа дня 23 января», мы обычно подразумеваем 3 часа дня на часах на стене для часового пояса, действующего в настоящее время на эту дату, а не как сегодня. Например, если правительство переводит часы на полчаса, мы не хотим, чтобы наше назначение состоялось в 2:30, мы все еще хотим 3:00 - это другой момент, чем если бы политики оставили нетронутыми определения часовых поясов.

ZoneId

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

Booking класс

Итак, ваш Booking класс выглядит примерно так.

public class Booking {
    String clientName ;
    LocalDateTime appointment ;
    ZoneId zoneId ;
}

Для создания экземпляра:

LocalDateTime = LocalDateTime( 2019 , 1 , 23 , 15 , 0 , 0 , 0 ) ; // 3 PM on Jan 23, 2019.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Booking booking = new Booking( "Alice" , ldt , z ) ;

Соберите такие экземпляры.

List< Booking > bookings = new ArrayList<>() ;
bookings.add( booking ) ;

Сравнить с фильтром

Чтобы отфильтровать эти заказы по определенной дате, зациклите собранные объекты Booking, извлеките LocalDateTime из каждого, извлеките значение только для даты (a LocalDate) и сравните с целевой датой.

LocalDate target = LocalDate.of( 2019 , Month.FEBRUARY , 1 ) ; // First of February.
List< Booking > filteredBookings = new ArrayList<>() ;
for( Booking booking : bookings ) {
    if( booking.appointment.toLocalDate().isEqual( target ) ) {
        filteredBookings.add( booking ) ; // Collect this `Booking` object whose date matches our target date.
    }
}

ZonedDateTime вновь

Когда вам нужен определенный момент, например, создание системы календаря или при записи истории, примените часовой пояс (ZoneId) к дате-времени (LocalDateTime), чтобы получить момент (ZonedDateTime).

ZonedDateTime zdt = booking.appointment.atZone( booking.zone ) ;

Чтобы увидеть этот момент в UTC, ту же точку на временной шкале, но другое время на настенных часах, извлеките объект Instant.

Instant instant = zdt.toInstant() ;  // Adjust from time zone to UTC.

Обычно лучше всего работать с UTC, а не с зонированным значением для ведения журнала, базы данных, хранения и обмена данными.


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на java.time классы.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 11 января 2019

Скорее всего, ваша ошибка исходит из этой строки Date date = setCal.parse(getDay+ "/" + getMonth +"/" + getYear); Здесь вы ожидаете дату в формате "dd/MM/yyyy", но, возможно, значения, которые поступают в качестве входных данных, отличаются. Пожалуйста, проверьте, что у вас есть для getDay, getMonth и getYear.

P.S. После того, как вы обнаружите свою ошибку, вам нужно сделать дату в календаре. Вы можете сделать это:

 Calendar cal = Calendar.getInstance();
 calendar.setTime(date);
 filteredBookings.add(cal);

Удачи!

...