我正在内部创建一个阳历日历,该方法称为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
类。
答案 0 :(得分:1)
您使用的是可怕的旧日期时间类,而这些类早已被现代的 java.time 类所取代。
ZonedDateTime
具体地说,GregorianCalendar
类被ZonedDateTime
代替。此类表示一个时刻,时间轴上的一点,日期,一天中的时间和时区。
但是ZonedDateTime
不适合安排将来的约会。相反,在预订将来的约会时,我们必须将日期和时间与时区分开。下面有更多说明。
LocalDate
将年,月和日的字符串输入转换为数字。
int y = Integer.parseInt( year ) ;
int m = Integer.parseInt( month ) ;
int d = Integer.parseInt( day ) ;
实例化LocalDate
。 LocalDate
类表示没有日期,没有time zone或offset-from-UTC的仅日期值。
LocalDate ld = LocalDate.of( y , m , d ) ;
LocalDateTime
您的Booking
类应具有LocalDateTime
成员变量。此类故意缺少任何time zone或offset-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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
您的错误很可能来自此行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);
祝你好运!
答案 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