无限循环试图在Java中迭代日期

时间:2015-11-30 22:58:37

标签: java date for-loop

我试图迭代日期而没有成功,因为一个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;
}

2 个答案:

答案 0 :(得分:7)

您的addDays()函数返回一个新日期,而不是更改参数。

因此,您需要更改for循环的增量部分:

for ( ...; addDays(initDate, 1)) { ...

到此:

for ( ...; initDate = addDays(initDate, 1)) { ...

答案 1 :(得分:2)

接受的答案是正确的。

从Java 8及更高版本开始,java.util.Date /。Calendar类现已过时。

java.time

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 );
}