想知道如何比较JDateChooser和LocalNow

时间:2018-01-29 16:08:52

标签: java datetime date-comparison jdatechooser localdate

所以我正在尝试创建一个if else语句,如果来自jdatechooser的日期是在今天的日期之前,则会出现错误消息。据我所知,您可以将今天的日期作为LocalDate.now(),将其格式化为字符串,然后执行try-catch将其解析为Date。对于jdatechooser,您可以将其作为Date获取,将其格式化为字符串,然后执行try-catch以将其解析为日期。唯一的问题是当你执行jdate.before(localdate)时会发生错误。还有另一种方法吗?我看到你可以将今天的日期作为一个实例,但我对此没有多少经验。

这是我尝试过的代码:

try {
    //Checks to see if New Due Date is a date set before today's date

    //Grabs today's date, converts it into string, then converts it into date
    LocalDate ld = LocalDate.now();
    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy");
    String tds = sdf.format(ld);
    Date tdd = sdf.parse(tds);

    //Grabs reactivateDateChooser1, converts it into string, then converts it into date
    Date rdc = reactivateDateChooser1.getDate();
    SimpleDateFormat sdf1 = new SimpleDateFormat("MMM dd, yyyy");
    String rdcs = sdf1.format(rdc);
    Date rdcd = sdf1.parse(rdcs);

    //If the new Due Date is before or on today's date, then error message will show
    if(rdcd.before(tdd)){
        JOptionPane.showMessageDialog(null, "Please select a date after " + tds, "Select Valid Date", JOptionPane.ERROR_MESSAGE);
    }

    //If the date chooser is empty, then error message will show
    else if (reactivateDateChooser1.getDate() == null){
        JOptionPane.showMessageDialog(null, "Please select a date", "Needs Date", JOptionPane.ERROR_MESSAGE);
    }

    //Otherwise, if the new date is after today's date, then the function will happen
    else if (rdcd.after(tdd)){
        changeStatusToActive();
        statusCheck1.setText("");
        refreshClassTable();
        closeReactivateDialog();
    }
} catch(Exception e){
    JOptionPane.showMessageDialog(null, e);
}

这是我得到的错误:

java.lang.IllegalArgumentException: Cannot format given Object as a Date

2 个答案:

答案 0 :(得分:1)

<强>编辑:

阅读了Ole V.V.的Calendar和SimpleDateFormatter问题。提到我意识到我给出的解决方案不是很好......下面是使用LocalDate和DateTimeFormatter的代码:

LocalDate ld = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM dd, yyyy");
String output = ld.format(dtf);

<强>原始

我不能说为什么Ole V.V.告诉你要避免像SimpleDateFormat这样的课程,我对这个主题不太了解。但是,要实现您想要做的事情,您可以使用:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy");
String tds = sdf.format(cal.getTime());

这应该可以帮助您获取当前时间和日期,并根据需要对其进行格式化。

答案 1 :(得分:1)

    DateTimeFormatter dateFormatter
                = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.ITALY);
    //Checks to see if New Due Date is a date set before today's date

    //Grabs today's date
    LocalDate today = LocalDate.now();

    //Grabs reactivateDateChooser1, converts it into LocalDate (if not null)
    Date reactivateUtilDate = reactivateDateChooser1.getDate();

    //If the date chooser is empty, then error message will show
    if (reactivateUtilDate == null) {
        JOptionPane.showMessageDialog(null, "Please select a date", 
                    "Needs Date", JOptionPane.ERROR_MESSAGE);
    } else {
        LocalDate reactivateDate = reactivateUtilDate.toInstant()
                    .atZone(ZoneId.of("Asia/Singapore"))
                    .toLocalDate();

        //If the new Due Date is before or on today's date, then error message will show
        //Otherwise, if the new date is after today's date, then the function will happen
        if (reactivateDate.isAfter(today)) {
            changeStatusToActive();
            statusCheck1.setText("");
            refreshClassTable();
            closeReactivateDialog();
        } else {
            String todayString = today.format(dateFormatter);
            JOptionPane.showMessageDialog(null, 
                        "Please select a date after " + todayString,
                        "Select Valid Date", JOptionPane.ERROR_MESSAGE);
        }
    }

不是从现代LocalDate转换为过时的Date,而是尽可能地使用现代且更好的API。我知道您无法避免从java.util.Date获取JDateChooser,因此首先要将其转换为现代Instant类型并从那里进行进一步转换以获得LocalDate可以与你拥有的那个相比。 LocalDate有方法isBeforeisAfter用于与其他LocalDate个对象进行比较。

旧的日期和时间类DateSimpleDateFormat和朋友已被证明设计不佳,尤其SimpleDateFormat非常麻烦。只需看看Stack Overflow上有多少关于SimpleDateFormat的令人惊讶和不受欢迎的行为的问题。所有这一切都是Oracle在2014年发布java.time作为替代品的原因。当然,现代API可以更好地使用。我热情地推荐它。

我还建议您为格式化程序指定区域设置(即使您只是指定Locale.getDefault())和从Date转换为LocalDate的时区(即使您去了{{因此,没有人需要怀疑使用了语言环境和时区,并且你有意识地选择了它们。最后,我尝试了更多解释变量名称。