我试图迭代日期而没有成功,因为一个inifite循环发生,它不会停止在数据库中创建记录。为什么呢?
我有以下方法,该方法将作为参数传递的日期递增一,然后将其更新。
public static Date addDays(Date date, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);
return cal.getTime();
}
然后我以这种方式在for循环中使用它......
for (Date initDate = fromDate; initDate.before(toDate); addDays(initDate, 1)) {
// Do something...
}
fromDate和toDate是以这种方式解析为sql.Date的JTextField中的值。
private java.sql.Date fechaParser(String f) {
SimpleDateFormat formatDate = new SimpleDateFormat("dd/MM/yyyy");
Date date;
try {
date = formatDate.parse(f);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
return sqlDate;
} catch (ParseException e) {
JOptionPane.showMessageDialog(null, "Wrong date format.");
e.printStackTrace();
}
return null;
}
答案 0 :(得分:7)
您的addDays()
函数返回一个新日期,而不是更改参数。
因此,您需要更改for循环的增量部分:
for ( ...; addDays(initDate, 1)) { ...
到此:
for ( ...; initDate = addDays(initDate, 1)) { ...
答案 1 :(得分:2)
接受的答案是正确的。
从Java 8及更高版本开始,java.util.Date /。Calendar类现已过时。
Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
首先,我们使用模式定义格式化程序以匹配我们预期的输入字符串。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
java.time框架包含一个表示仅限日期的值的类,没有时间:LocalDate
。该类的静态方法可以解析。
String input = "05/07/2013";
LocalDate localDate_Start = LocalDate.parse( input , formatter );
如果用户向我们提供错误的文字输入,则parse
方法会抛出DateTimeParseException
。所以我们应该抓住并处理这个例外。
try{
LocalDate localDate_Start = LocalDate.parse( input , formatter );
} catch ( DateTimeParseException e ) {
// … handle the exception …
}
LocalDate
类包含plusDays
方法来添加天数。
LocalDate localDate_Stop = localDate_Start.plusDays( someNumberOfDays );
顺便说一句,在日期时间工作中,我们通常使用半开放式方法,其中开头是包容性的,而结束是排他性的。例如,一周将从周一开始,但不包括在下一个星期一。
while
循环对我来说比使用for
循环更有意义
要做一些数据库工作,我们必须从java.time.LocalDate转换为java.sql.Date。有一天,JDBC驱动程序将更新为直接处理java.time类型,但在此之前我们必须进行转换。寻找新添加的转换方法,例如java.sql.Date.valueOf( LocalDate localDate )
。
LocalDate localDate = localDate_Start;
while( localDate.isBefore( localDate_Stop ) ) {
// Do some database work.
// Until JDBC drivers updated to handle java.time types, convert to java.sql type.
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
// … do you database work.
// Prepare for next iteration of this 'while' loop.
localDate = localDate.plusDays( 1 );
}