Java 使用.compare比较日期时,为什么';这不是要考虑几个月吗?
我正在显示ArrayList中的某些日期,并使用格式化程序将日期缩短为“dd/MM”,但当我比较这些日期时,它在几个月内不起作用。e、 g.17/08在19/08之前,21/08在19/08之后,但17/09在19/08之前。我的程序实现的是显示未来8天内的任何日期 我试过使用.compareTo来实现这一点,它可以在一个月内工作,但不能在两个月之间工作。我知道这是比较字符串,我认为这是问题所在,但我不知道如何绕过它Java 使用.compare比较日期时,为什么';这不是要考虑几个月吗?,java,date,simpledateformat,date-formatting,compareto,Java,Date,Simpledateformat,Date Formatting,Compareto,我正在显示ArrayList中的某些日期,并使用格式化程序将日期缩短为“dd/MM”,但当我比较这些日期时,它在几个月内不起作用。e、 g.17/08在19/08之前,21/08在19/08之后,但17/09在19/08之前。我的程序实现的是显示未来8天内的任何日期 我试过使用.compareTo来实现这一点,它可以在一个月内工作,但不能在两个月之间工作。我知道这是比较字符串,我认为这是问题所在,但我不知道如何绕过它 SimpleDateFormat formatter = new Simple
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);
}
}
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd/MM”);
Calendar cal=Calendar.getInstance();
日期comDate=新日期();
计算添加(日历日期,8);
//这会给日历增加天数
comDate=cal.getTime();
字符串strDate=formatter.format(comDate);
//这会将编辑的日历应用于我比较的日期
ArrayList arDat=新的ArrayList();
同上,添加(“15/08”);
新增(2009年9月15日);
同上,添加(“30/08”);
日期recDate=新日期();
对于(int i=0;i
我希望它只显示15/08,但它显示15/08和15/09您正在比较日期字符串。Calendar类实现了
Compariable
接口。它将正确比较
看
因此,您在固定版本中的代码:
for (int i=0; i < arDat.size(); i++){
recDate = formatter.parse(arDat(i));
if (recDate.compareTo(comDate) < 0 {
showToast(recDate);
}
}
for(int i=0;i
格式化时,它将转换为字符串
。您正在格式化和比较。因此,它正在执行字符串
比较。因此,结果是
如果希望得到预期的结果,则必须比较日期
对象。我已修改了您的代码以比较字符串
和日期
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);
}
}
}
}
注意:我没有直接将recDate
与compDate
进行比较,因为compDate
是当前年份(2019
),而recDate
是默认年份(1970
)因此,首先我格式化了compDate
以去除年份、时间等,然后在比较之前再次解析为Date
。java.time.MonthDay
不要使用过时的日历
类,您可以使用现代java.time
类。如果您对天和月感兴趣,可以使用类及其比较方法:
MonthDay monthDay = MonthDay.of(8, 15);
MonthDay monthDay1 = MonthDay.of(9, 15);
System.out.println(monthDay.compareTo(monthDay1));
给出:
-1
您可能会发现这些方法更方便,并且
java.time类内置于java 8和更高版本中。对于java 6和java 7,请将该库添加到您的项目中。您在java 8中使用了新库日期-时间API相关回答:仅供参考,麻烦的日期-时间类,例如
java.util.date
,java.util.Calendar
,&java.text.SimpleDateFormat
,现在是遗留的,支持大多数java.time功能在项目中被移植到Java6和Java7。进一步适应早期的Android(我建议您不要使用SimpleDateFormat
和Date
。这些类的设计很差,而且很早就过时了,前者特别麻烦。相反,请使用MonthDay
和DateTimeFormatter
,这两种格式都来自于。为什么排除30/08有效,我如何实现与日历类我知道,但我目前只限于使用非常旧的java,因为我使用的是旧的工作laptop@TomPallaghy然后将库添加到您的项目中,其中大多数java.time功能都被移植到java 6和java 7中。值得一提的是,遗留下来的东西真的非常糟糕,非常糟糕,非常糟糕多年前,随着JSR 310的采用,这里使用的SSE被java.time类取代。在中找到现代解决方案。是的,强烈建议切换到“java.time”类。
-1