java - 时间在Java中完成全天检查

标签 java time date-format

我有一个包含时间信息的列表,如下所示,

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:5910:00-10:59(完成一整天)

  • 00:00-11:5900:00-11:59(未完成一整天)

    等等..

任何人都可以提出任何其他逻辑吗?

最佳答案

我建议采用以下方法。它使用LocalTime来简化时间操作,并使用Pattern来解析输入。

  1. 使用创建 LocalTime 的正则表达式解析输入。将它们存储在Map中,使用开始作为,结束作为
  2. map 进行排序。
  3. 使用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/

相关文章:

php - 在 php 中将 dd-mm-yyyy 转换为 yyyy-mm-dd

javascript - 检查字符串是否为日期值

java - 帮助构造一个以ArrayList为参数的类

java - 在 Java 中使用 java.util.Date 进行不同的时间转换

c++ - 如果时刻恰好在冬季结束时(非夏令时),日期/时间转换问题

javascript - 获取尊重时间格式而不是上一个时间格式的下一个时间

javascript - 从日期获取月份名称

java - Hibernate jpa子对象不保存

java - spring 的 mongo db 身份验证错误(查询失败,错误代码 13 和错误消息)

Python:strptime() 格式时区字段未按预期工作