gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:30:55 25 4
gpt4 key购买 nike

我有一组日期范围,如果任何日期在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com