java - 我有一组日期范围,如果任何日期在 java 中重叠,我需要获取合并的日期范围

标签 java string date intervals localtime

我有一组日期范围,如果任何日期在 Java 中重叠,我需要获取合并的日期范围。

给定三组日期范围,如果其中任何日期与另一组日期范围重叠,则需要合并。

示例:

20170101-20170331
20170101-20170430
20170430-20170501

预期结果是:

20170101-20170430
20170430-20170501

我有字符串变量中的所有日期。请任何人帮助我如何编写代码。我已将我的代码粘贴在下面。

我想达到预期的结果。我不知道如何修改这段代码。我是初学者,请帮助我做到这一点。我从 StackOverflow 获得了这个示例程序。

package com.kkkkk.Combine;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

public class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        ArrayList<Interval> x = new ArrayList<>();
        x.add(new Interval("20170430", "20170501")); // "20170101", "20170430"
        x.add(new Interval("20170101", "20170430"));// 20170101-20170430
                x.add(new Interval("20170101", "20170331"));
                x = merge(x);

        for (Interval i1 : x) {
            System.out.println(i1.getStartDate() + " " + i1.getEndDate());

        }

    }

    public static ArrayList<Interval> merge(ArrayList<Interval> intervals) {


        if (intervals.size() == 0 || intervals.size() == 1)
            return intervals;

        ArrayList<Interval> result = new ArrayList<Interval>();

        Collections.sort(intervals, new IntervalComparator());


        System.out.println("intervals ggggg\n" + intervals + "\n");

        Interval first = intervals.get(0);

        String start = first.getStartDate();
        String end = first.getEndDate();
        Date startDateF = null;
        Date endDateF = null;

        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            startDateF = sdf.parse(start);
            endDateF = sdf.parse(end);


            // ArrayList<Interval> result = new ArrayList<Interval>();

            for (int i = 1; i < intervals.size(); i++) {

                Interval current = intervals.get(i);

                Date currentEndDate = sdf.parse(current.getEndDate());
                Date currentStartDate = sdf.parse(current.getStartDate());

                // if ((current.getStartDate().after(endDateF)) ||
                                Date d1 = minDate(endDateF, currentStartDate);

                                if ((currentStartDate).compareTo(endDateF) <= 0) {
                    endDateF = maxDate(currentEndDate, endDateF);

                                                        } else {

                                                            result.add(new Interval(start, (sdf.format(endDateF))));

                    // start = current.start;
                    // end = current.end;

                    start = sdf.format(currentStartDate);
                    endDateF = (currentEndDate);



    enter code here

                }

            }
            result.add(new Interval(start, end));
            // result.add(new Interval(start, (sdf.format(endDateF))));
        }

        catch (ParseException ex) {
            ex.printStackTrace();
        }

        // result.add(new Interval(start, end));

        return result;
        // return intervals;

    }

    public static Date minDate(Date date1, Date date2) {
        // if date1 before date2 then return date1 else return date2

        return date1.before(date2) ? date1 : date2;
    }

    /**
     * find Max Dates
     * 
     * @param date1
     * @param date2
     * @return
     */
    public static Date maxDate(Date date1, Date date2) {
        // if date1 after date2 then return date1 else return date2
        System.out.println("date max");
        return date1.after(date2) ? date1 : date2;
    }
}

最佳答案

ISO 8601

将日期时间值序列化为文本时使用标准 ISO 8601 格式。您的格式符合标准的“基本”版本,但最好尽可能使用完整格式:

YYYY-MM-DD

使用日期范围的标准格式,并使用斜杠字符作为分隔符:

YYYY-MM-DD/YYYY-MM-DD

如果无法更改输入字符串,请在连字符上拆分字符串。将每个部分解析为 LocalDate 。使用这些对象实例化 LocalDateRange .

LocalDate ld = LocalDate.parse( "20170101" , DateTimeFormatter.BASIC_ISO_DATE ) ; 

LocalDateRange

使用 LocalDateRange 来自 ThreeTen-Extra 的类(class)扩展 java.time 类功能的项目。解析和生成文本时使用标准格式。

LocalDateRange range = LocalDateRange.parse( "2017-01-01/2017-03-31" ) ;

收集到 List<LocalDateRange> .

要排序,请编写一个调用 LocalDateRange::getStart 的比较器.

与另一个范围进行比较,看看它们是否重叠。如果是这样,请结合调用 union .

if ( range.overlaps( otherRange ) ) {
    range = range.union( otherRange ) ;
}

如果它们不重叠,则您已完成该轮。将此结果存储在另一个 List<LocalDateRange> 中。从下一个范围开始另一轮。

起泡沫,冲洗,重复。

关于java - 我有一组日期范围,如果任何日期在 java 中重叠,我需要获取合并的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148294/

相关文章:

ios - 如何使用正确的自动换行跨等边界 View 拆分 NSAttributedString

php - 将日期 dd/mm/yyyy 格式从表单转换为时间戳?

javascript - 如何使用 moment 获取最近 3 周的日期范围?

java - 获取 PageRank

java - 使用 maven-compiler 和 jdk9-ea+148 编译测试

c# - MVC3 : Submit string - parse fails on IE and Chrome

php - 如何计算当前日期存储在数据库中的年龄?

java - 当类具有与导入方法同名的方法时,import static 不起作用

java - Vaadin 不允许导入外部脚本

python - 如何在 Python 中查找字符串中的空字节?