要检查当前日期是否小于到期日期

时间:2018-09-17 12:14:33

标签: java mysql date javafx date-comparison

我想在打开软件之前检查系统日期(例如当前日期)是否早于到期日期。

我编写了以下代码,但是它引发了NumberFormatException。为什么会发生这种情况?

public class dateController implements Initializable {

    @FXML Label lblDate;

    Alert alert = new Alert(AlertType.INFORMATION);

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date date = new Date();

        lblDate.setText(dateFormat.format(date));

        String a ="19/09/2018";

        String currentdate = lblDate.getText();

        String LastRunDate = currentdate;

        if(Integer.parseInt(currentdate) < Integer.parseInt(a)) {
            alert.setHeaderText(null);             
            alert.setContentText("Successfull");
            alert.show();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

为什么会这样?

Integer.parseInt适用于将42之类的字符串解析为int。您正在尝试使用该方法解析诸如17/09/2018之类的字符串。您的字符串不代表有效的int值(坦率地说,我不知道您希望从中得出哪个整数?)因此,parseInt方法将抛出NumberFormatException。 / p>

那该怎么办?

使用LocalDate表示日期,并使用其isBefore(或isAfter)与另一个日期进行比较。

    LocalDate expirationDate = LocalDate.of(2018, Month.SEPTEMBER, 19);
    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    if (today.isBefore(expirationDate)) {
        alert.setHeaderText(null);             
        alert.setContentText("Successful");
        alert.show();
    }

请注意,与问题中的代码相比,它要简单得多。在这种情况下,您不需要格式化或解析。我正在使用JVM的时区设置来获取今天的日期(您也在问题中也做了此操作)。因此,用户可能会通过更改时区来将到期时间推迟几个小时。如果您想避免这种情况,也可以对时区进行硬编码,例如ZoneId.of("Asia/Ust-Nera")

如果您确实需要解析像19/09/2018这样的字符串:

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    String a ="19/09/2018";
    LocalDate expirationDate = LocalDate.parse(a, dateFormatter);

    System.out.println("Expiration date is " + expirationDate);

此代码段输出:

  

到期日期是2018-09-19

远离DateDateFormatSimpleDateFormat。他们早已过时,尤其是最后两个麻烦。改为使用现代Java日期和时间API java.time。

链接: The Java™ Tutorials: Trail: Date Time