Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用.compare比较日期时,为什么';这不是要考虑几个月吗?_Java_Date_Simpledateformat_Date Formatting_Compareto - Fatal编程技术网

Java 使用.compare比较日期时,为什么';这不是要考虑几个月吗?

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

我正在显示ArrayList中的某些日期,并使用格式化程序将日期缩短为“dd/MM”,但当我比较这些日期时,它在几个月内不起作用。e、 g.17/08在19/08之前,21/08在19/08之后,但17/09在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);
    }
}
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