我正在显示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
答案 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::isBefore
,isAfter
和equals
更方便。
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
个对象。我已经修改了您的代码以同时比较Strings
和Dates
。
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
注意:我没有直接将recDate
与compDate
进行比较,因为compDate
是当年(2019
)和{{1 }}为预设年份(recDate
)。因此,我首先格式化1970
以去除年份,时间等,然后在比较之前再次解析为compDate
。