给定时间区间,按年分割,返回年份和对应的时间区间,处理了边界
测试用例、算法如下,运行 main方法即可
测试结果
算法代码
package com.example.demo;
import com.alibaba.fastjson.JSONObject;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;
public class x {
public static void main(String[] args) {
LocalDateTime start1 = LocalDateTime.of(2014, 1, 1, 0, 0, 0, 0);
LocalDateTime end1 = LocalDateTime.of(2014, 12, 31, 23, 59, 59,999999999);
System.out.println("一年内");
disResult(splitYear(Timestamp.valueOf(start1), Timestamp.valueOf(end1)));
LocalDateTime start2 = LocalDateTime.of(2014, 1, 1, 0, 0, 0,0);
LocalDateTime end2 = LocalDateTime.of(2015, 12, 31, 23, 59, 59,999999999);
System.out.println("1到2年");
disResult(splitYear(Timestamp.valueOf(start2), Timestamp.valueOf(end2)));
LocalDateTime start3 = LocalDateTime.of(2014, 1, 1, 0, 0, 0,0);
LocalDateTime end3 = LocalDateTime.of(2016, 12, 31, 23, 59, 59,999999999);
System.out.println("2年以上");
disResult(splitYear(Timestamp.valueOf(start3), Timestamp.valueOf(end3)));
LocalDateTime start4 = LocalDateTime.of(2017, 12, 31, 23, 59, 59,999999999);
LocalDateTime end4 = LocalDateTime.of(2018, 12, 31, 23, 59, 59,999999999);
System.out.println("边界处理:左");
disResult(splitYear(Timestamp.valueOf(start4), Timestamp.valueOf(end4)));
LocalDateTime start5 = LocalDateTime.of(2018, 1, 1, 0, 0, 0,0);
LocalDateTime end5 = LocalDateTime.of(2019, 1, 1, 0, 0, 0,0);
System.out.println("边界处理:右");
disResult(splitYear(Timestamp.valueOf(start5), Timestamp.valueOf(end5)));
LocalDateTime start6 = LocalDateTime.of(2019, 12, 31, 23, 59, 59,999999999);
LocalDateTime end6 = LocalDateTime.of(2021, 1, 1, 0, 0, 0,0);
System.out.println("边界处理:两边");
disResult(splitYear(Timestamp.valueOf(start6), Timestamp.valueOf(end6)));
}
public static JSONObject buildTime(Timestamp start, Timestamp end) {
JSONObject time = new JSONObject();
time.put("year", start.toLocalDateTime().getYear());
time.put("start", start);
time.put("end", end);
return time;
}
public static List<JSONObject> splitYear(Timestamp start, Timestamp end) {
System.out.println( " s:"+start.toLocalDateTime()+" e :"+end.toLocalDateTime());
List<JSONObject> list = new ArrayList<>();
int year = start.toLocalDateTime().getYear();
Timestamp compare = Timestamp.valueOf(LocalDateTime.of(year, 12, 31, 23, 59, 59,999999999));
if (compare.compareTo(start) >= 0 && compare.compareTo(end) >= 0) {
list.add(buildTime(start, end));
handleSplitResult(list);
return list;
}
Timestamp last = start;
while (compare.compareTo(end) < 0) {
Timestamp endTrim = Timestamp.valueOf(LocalDateTime.of(year+1, 1, 1, 0, 0, 0,0));
if (compare.compareTo(start) > 0 && !endTrim.equals(end)) {
list.add(buildTime(last, compare));
last = compare;
}
year++;
compare = Timestamp.valueOf(LocalDateTime.of(year, 12, 31, 23, 59, 59,999999999));
}
list.add(buildTime(last, end));
handleSplitResult(list);
return list;
}
public static void handleSplitResult( List<JSONObject> list){
for (JSONObject time:list) {
LocalDateTime s= ((Timestamp)time.getTimestamp("start")).toLocalDateTime();
LocalDateTime e= ( (Timestamp)time.getTimestamp("end")).toLocalDateTime();
if(s.getMonth().equals(Month.DECEMBER) && s.getDayOfMonth()==31
&& s.getHour()==23&&s.getMinute()==59&&s.getSecond()==59 ){
time.put("start", Timestamp.valueOf(LocalDateTime.of(s.getYear()+1, 1, 1, 0, 0, 0,0)));
time.put("year", s.getYear()+1);
}
if(e.getMonth().equals(Month.JANUARY) && e.getDayOfMonth()==1
&& e.getHour()==0&&e.getMinute()==0&&e.getSecond()==0 ){
time.put("end", Timestamp.valueOf(LocalDateTime.of(e.getYear()-1, 12, 31, 23, 59, 59,999999999)));
time.put("year", e.getYear()-1);
}
}
}
public static void disResult( List<JSONObject> list){
for (JSONObject time:list) {
LocalDateTime s= ((Timestamp) time.getTimestamp("start")).toLocalDateTime();
LocalDateTime e= ((Timestamp) time.getTimestamp("end")).toLocalDateTime();
int y=time.getInteger("year");
System.out.println(y+" " +s+ " "+e);
}
}
}