我有一个包含时间信息的列表,如下所示,
List<String> dayList = new LinkedList<String>();
dayList.add("00:00-23:59");
我需要查明该列表是否满足一整天的需求。
我尝试的是,
List<String> dayList = new LinkedList<String>();
dayList.add("00:00-12:59");
dayList.add("13:00-20:30");
dayList.add("20:31-23:59");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
long totalMinutes = 0;
for(String data : dayList){
Date startDate = sdf.parse(data.split("-")[0]);
Date endDate = sdf.parse(data.split("-")[1]);
totalMinutes += TimeUnit.MILLISECONDS.toMinutes(endDate.getTime()-startDate.getTime());
}
if(totalMinutes==(1439-(dayList.size()-1))){
System.out.println("Completes Full Day");
} else{
System.out.println("Not Completes Full Day");
}
注意:列表项可以相互重叠。
如果列表包含,则此逻辑失败
11:00-09:59
和10:00-10:59
(完成一整天)00:00-11:59
和00:00-11:59
(未完成一整天)等等..
任何人都可以提出任何其他逻辑吗?
最佳答案
我建议采用以下方法。它使用LocalTime来简化时间操作,并使用Pattern来解析输入。
- 使用创建 LocalTime 的正则表达式解析输入。将它们存储在Map中,使用开始作为键,结束作为值。里>
- 对 map 的键进行排序。
- 使用LocalTime操作检查间隔边界。不要忘记一天的开始结束。
主要方法:
public static void main(String[] args) {
List<String> dayList = new LinkedList<String>();
dayList.add("00:00-12:59");
dayList.add("13:00-20:30");
dayList.add("18:31-23:59");
Pattern pattern = Pattern.compile("([0-9]{2}:[0-9]{2})-([0-9]{2}:[0-9]{2})");
DayCoverage dayCoverage = new DayCoverage();
for (String day : dayList) {
Matcher matcher = pattern.matcher(day);
if (!matcher.matches()) {
System.err.println("Invalid day entry: " + day);
return;
}
LocalTime start = LocalTime.parse(matcher.group(1));
LocalTime end = LocalTime.parse(matcher.group(2));
dayCoverage.addIntervall(start, end);
}
if (dayCoverage.isComplete()) {
System.out.println("Completes Full Day");
} else {
System.out.println("Not Completes Full Day");
}
}
类(class)日报道:
static class DayCoverage {
private Map<LocalTime, LocalTime> cover = new HashMap<>();
public void addIntervall(LocalTime start, LocalTime end) {
if(end.isBefore(start)){
this.cover.put(end, start);
} else {
this.cover.put(start, end);
}
}
public boolean isComplete() {
if(this.cover.isEmpty()){
System.err.println("Coverage empty.");
return false;
}
Set<LocalTime> startTimes = this.cover.keySet();
List<LocalTime> sortedStartTimes = new ArrayList<>(startTimes);
Collections.sort(sortedStartTimes);
LocalTime first = sortedStartTimes.get(0);
if(! LocalTime.MIN.equals(first)){
System.err.println("Coverage does not start with 00:00.");
return false;
}
LocalTime lastEnd= LocalTime.MIN;
for (LocalTime start : sortedStartTimes) {
if(lastEnd.plus(1, ChronoUnit.MINUTES).isBefore(start)){
System.err.println("Missing coverage between: " + lastEnd + " and " + start);
return false;
}
lastEnd = this.cover.get(start);
}
if(LocalTime.MAX.truncatedTo(ChronoUnit.MINUTES).isAfter(lastEnd)){
System.err.println("Missing coverage between: " + lastEnd + " and 23:59");
return false;
}
return true;
}
}
关于java - 时间在Java中完成全天检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38661488/