我想在打开软件之前检查系统日期(例如当前日期)是否早于到期日期。
我编写了以下代码,但是它引发了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();
}
}
}
答案 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
远离Date
,DateFormat
和SimpleDateFormat
。他们早已过时,尤其是最后两个麻烦。改为使用现代Java日期和时间API java.time。