在Java中将日期作为字符串进行比较

在Java中将日期作为字符串进行比较,java,string,string-comparison,Java,String,String Comparison,我无法将日期作为字符串进行比较。我需要遍历一个集合,并将每个对象的日期值与作为参数传递的两个日期进行比较。这些日期都存储为字符串,我需要这样保存它们 众所周知,所有日期都将被格式化为YYYY-MM-DD。下面是我的意思的一个简单例子。谢谢大家 public ArrayList<Object> compareDates(String dateOne, String dateTwo) { for(Object object : objectCollection) {

我无法将日期作为字符串进行比较。我需要遍历一个集合,并将每个对象的日期值与作为参数传递的两个日期进行比较。这些日期都存储为字符串,我需要这样保存它们

众所周知,所有日期都将被格式化为
YYYY-MM-DD
。下面是我的意思的一个简单例子。谢谢大家

public ArrayList<Object> compareDates(String dateOne, String dateTwo) {
    for(Object object : objectCollection) {
        String objectDate = object.getDate();
        if(objectDate.equals(dateOne) || objectDate.equals(dateTwo)) { // Unsure of how to determine if the objects date is inbetween the two given dates
            //add object to collection
        }
    }
return  collection;
}
public ArrayList compareDates(字符串dateOne,字符串dateTwo){
for(对象:objectCollection){
字符串objectDate=object.getDate();
if(objectDate.equals(dateOne)| objectDate.equals(dateTwo)){//不确定如何确定对象日期是否在两个给定日期之间
//将对象添加到集合
}
}
回收;
}

以下是您需要遵循的步骤:

  • 将字符串dateOne和字符串dateTwo转换为
    java.time.LocalDate
  • 迭代ArrayList并将索引字符串转换为
    java.time.LocalDate

    注意:您需要接受
    ArrayList
    才能将字符串解析为LocalDate,而不是
    ArrayList

  • 做比较
  • 实现比较逻辑


    您可以参考。

    因为您的日期是
    YYYY-MM-DD
    格式,所以可以使用词典比较来确定两个日期之间的顺序。因此,您可以使用该方法来比较字符串:

    int c1 = objectDate.compareTo(dateOne);
    int c2 = objectDate.compareTo(dateTwo);
    if ((c1 >= 0 && c2 <= 0) || (c1 <= 0 && c2 >= 0)) {
        // objectDate between dateOne and dateTwo (inclusive)
    }
    
    int c1=objectDate.compareTo(dateOne);
    int c2=objectDate.compareTo(dateTwo);
    
    如果((c1>=0&&c2=0&&c2
    日期采用
    yyyy-MM-dd
    格式,则字符串的
    比较应返回一致的结果:

    if(objectDate.compareTo(dateOne) >= 0 && objectDate.compareTo(dateTwo) <= 0)
    

    if(objectDate.compareTo(dateOne)>=0&&objectDate.compareTo(dateTwo)=dateOne&&objectDate如果dateOne在dateTwo之前,如果希望在两者之间有日期,可以使用以下比较

        public ArrayList<Object> compareDates(List<Object> objectCollection, String start, String end) {
            ArrayList<Object> dateBetween = new ArrayList<>();
            for(Object object : objectCollection) {
                LocalDate objectDate = parseDate(object.getDate());
                if( !objectDate.isBefore(parseDate(start)) && !objectDate.isAfter(parseDate(end))) {
                    dateBetween.add(object);
                }
            }
            return dateBetween;
        }
    
        private LocalDate parseDate(String date) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD");
            return LocalDate.parse(date, formatter);
        }
    
    public ArrayList compareDates(列表objectCollection、字符串开始、字符串结束){
    ArrayList dateBetween=新的ArrayList();
    for(对象:objectCollection){
    LocalDate objectDate=parseDate(object.getDate());
    如果(!objectDate.isBefore(parseDate(start))&&!objectDate.isAfter(parseDate(end))){
    dateBetween.add(对象);
    }
    }
    返回日期介于之间;
    }
    私有LocalDate parseDate(字符串日期){
    DateTimeFormatter formatter=模式的DateTimeFormatter.of(“YYYY-MM-DD”);
    返回LocalDate.parse(日期,格式化程序);
    }
    

    为什么要将日期作为字符串进行比较?有很多工具可以使日期的比较变得简单和精确,为什么不使用这些工具呢?如果您真的想坚持使用
    字符串,那么在比较之前转换为日期对象是唯一合理的方法,然后按
    将其拆分
    并比较分离的值。您可能需要将它们转换为
    int
    ,然后……也许您可以使用
    SimpleDataFormat
    从字符串中生成具体的
    Date
    对象并对其进行比较。上面的示例看起来不完整,即它不包含
    objectCollection
    variab的定义le.就像@Stultuske所说的,为什么要将它们作为streengs进行比较?你可以将它们解析为可比较的
    Calendar
    s或
    Date
    s。同意你的回答。但是,我想问题的作者所遇到的问题不是比较字符串,而是如何表达/实现“中间”以String.compareTo()表示的关系,返回一个int。也许您也可以扩展您的答案来解决这一部分。(@ernest_k的答案刚刚发布,添加了这样的解释)谢谢!在您和@ernest_k的答案之间,现在有很多意义了!我不认为转换为date更好。字符串比较快,转换慢,如果OP应该保持日期不变,就意味着每次都转换。也许您可以强调,您的实现只有在
    dateOne
    是在
    dateTwo
    @realponsign之前。这很容易,因为这只是本地日期值。如果引入时区、偏移量、夏令时复杂性,会怎么样?日期/时间类型显然更合适。比较字符串只需检查一次。转换字符串需要检查一次,然后还要执行以下操作:ng对日期和月份进行有效性检查。@Real怀疑论者没有争论你的观点。你在谈论性能,我在谈论准确性。但你有一个有效的观点,没有争论。在每个循环迭代中解析
    开始
    结束
    可能会花费很多钱…是的,但是将日期作为字符串进行比较对我来说似乎有点棘手。你可以将它们作为日期,在方法开始时调用一次。这只是一个想法。这会提高性能吗?毕竟您有相同数量的日期要解析吗?如果集合中有N个项目,使用当前代码,则调用
    parseDate
    3次(1次用于
    对象.getDate
    ,一次用于
    开始
    ,一次用于
    结束
    )在每次迭代中,
    3*N
    的总次数。但是只需要
    N+2
    的次数(对于
    start
    end
    只需要一次,对于N个对象中的每一个对象只需要一次)。如果您恰好有一个庞大的列表,那么这是大量不必要的
    DateTimeFormatter
    实例化和调用
    parse