公历日历对象以匹配ArrayList

时间:2019-01-11 13:54:20

标签: java calendar jcombobox gregorian-calendar

我正在内部创建一个阳历日历,该方法称为filterBookings(),它需要在其中创建一个阳历日历对象,以匹配用户输入的日期(从3个单独的ComboBox中选择选定的项目,分别称为cmbYear,cmbMonth和cmbDay )。该arrayList称为filteredBookings,当前是全局创建的。如果日期与匹配的预订的索引匹配,则应将其添加到arraylist中。代码中已经提到了输入。在输出面板中说:无法解析的日期。有人可以帮忙吗?我是新手,对此没有背景:(

 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 :(得分:1)

避免使用旧的日期时间类

您使用的是可怕的旧日期时间类,而这些类早已被现代的 java.time 类所取代。

ZonedDateTime

具体地说,GregorianCalendar类被ZonedDateTime代替。此类表示一个时刻,时间轴上的一点,日期,一天中的时间和时区。

但是ZonedDateTime不适合安排将来的约会。相反,在预订将来的约会时,我们必须将日期和时间与时区分开。下面有更多说明。

LocalDate

将年,月和日的字符串输入转换为数字。

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

实例化LocalDateLocalDate类表示没有日期,没有time zoneoffset-from-UTC的仅日期值。

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

LocalDateTime

您的Booking类应具有LocalDateTime成员变量。此类故意缺少任何time zoneoffset-from-UTC的概念。我们将其用于将来的约会,因为世界各地的政客经常更改其各自时区的偏移量。通常,他们这样做很少甚至没有警告。对于“ 1月23日下午3点”之类的约会,我们通常是指该日期当前有效的时区,在墙上的时钟旁的下午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,提取仅日期的值(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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您的错误很可能来自此行Date date = setCal.parse(getDay+ "/" + getMonth +"/" + getYear);,在这里您希望以"dd/MM/yyyy"格式出现日期,但是输入时输入的值可能不同。请检查getDaygetMonthgetYear的价格。

P.S。发现错误后,您需要使“日期”变为“日历”。您可以这样做:

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

祝你好运!

答案 2 :(得分:0)

可能是

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

为null,您也放置了无效的mounth,否则java不会出现异常:

        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