使用.compareTo比较日期时,为什么不考虑月份?

时间:2019-08-17 12:39:10

标签: java date simpledateformat date-formatting compareto

我正在显示ArrayList中的某些日期,并使用格式化程序将日期缩短为“ dd / MM”,但是当我比较日期时,这几个月都不起作用。例如17/08 IS在19/08之前,21/08 IS在19/08之后,但17/09 IS在19/08之前。我的程序实现的是显示接下来8天内的任何日期。

我尝试使用.compareTo来执行此操作,它可以在一个月内运行,但不会在几个月之间运行。我知道它正在比较字符串,我认为这是问题所在,但我不知道如何解决它

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM");
Calendar cal = Calendar.getInstance();
Date comDate = new Date();
cal.add(Calendar.DATE, 8);
//this adds days to the calender
comDate = cal.getTime();
String strDate = formatter.format(comDate);
//this applies the edited calender to the date I'm comparing to

ArrayList<String> arDat = new ArrayList<String>();
arDat.add("15/08");
arDat.add("15/09");
arDat.add("30/08");

Date recDate = new Date();

for (int i=0; i < arDat.size(); i++){
    recDate = formatter.parse(arDat(i));
    String strRecDate = formatter.format(recDate);
    if (strRecDate.compareTo(strDate) < 0 {
        showToast(recDate);
    }
}

我希望它只显示15/08,但它显示15/08和15/09

3 个答案:

答案 0 :(得分:3)

java.time.MonthDay

可以使用现代的Calendar类来代替使用过时的java.time类。如果您对几天和几个月感兴趣,可以使用MonthDay类,它是compareTo方法:

MonthDay monthDay = MonthDay.of(8, 15);
MonthDay monthDay1 = MonthDay.of(9, 15);
System.out.println(monthDay.compareTo(monthDay1));

给予:

-1

您可能会发现方法MonthDay::isBeforeisAfterequals更方便。

java.time 类内置于Java 8及更高版本中。对于Java 6和Java 7,将ThreeTen-Backport库添加到您的项目中。

答案 1 :(得分:0)

您正在比较日期的字符串。 Calendar类实现Comparable接口。它将正确比较。

请参见https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

因此您的代码为固定版本:

for (int i=0; i < arDat.size(); i++){
    recDate = formatter.parse(arDat(i));
    if (recDate.compareTo(comDate) < 0 {
        showToast(recDate);
    }
}

答案 2 :(得分:0)

格式化时会转换为String。您正在格式化和比较。因此,它正在做String比较。因此,结果。

如果要获得预期的结果,则必须比较Date个对象。我已经修改了您的代码以同时比较StringsDates

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

public class CompareDates {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM");
        Calendar cal = Calendar.getInstance();
        Date comDate = new Date();
        cal.add(Calendar.DATE, 8);
        //this adds days to the calender
        comDate = cal.getTime();
        //this applies the edited calender to the date I'm comparing to

        ArrayList<String> arDat = new ArrayList<String>();
        arDat.add("15/08");
        arDat.add("15/09");
        arDat.add("30/08");

        Date redDate = new Date();
        for (int i = 0; i < arDat.size(); i++) {
            Date recDate = formatter.parse(arDat.get(i));
            if (formatter.format(recDate).compareTo(formatter.format(comDate)) < 0) {
                System.out.println("String comparison result: " + recDate);
            }
            if (recDate.compareTo(formatter.parse(formatter.format(comDate))) < 0) {
                System.out.println("Date comparison result: " + recDate);
            }
        }
    }
}

这是预期的输出(与日期比较时仅打印8月15日):

String comparison result: Sat Aug 15 00:00:00 UTC 1970
Date comparison result: Sat Aug 15 00:00:00 UTC 1970
String comparison result: Tue Sep 15 00:00:00 UTC 1970

注意:我没有直接将recDatecompDate进行比较,因为compDate是当年(2019)和{{1 }}为预设年份(recDate)。因此,我首先格式化1970以去除年份,时间等,然后在比较之前再次解析为compDate