计算日期时间之间的时间

时间:2015-12-01 20:59:52

标签: java

我们说我有两个约会时间,2015年11月30日10:00和2015年12月12日15:00。我也有两次,07:00和22:00。我怎么能计算在第二次的两个日期/时间之间经过的时间量?使用Calendar对象?这看起来很简单,但令人难以置信。

2 个答案:

答案 0 :(得分:1)

由于其他答案都没有包含可运行的代码,我无法判断他们是否解决了问题。

要计算日期范围内的时间范围的持续时间,您必须:

  • 将日期范围拆分为多个日期范围,每个范围不超过一天。
  • 计算每天日期范围内的时间范围

从问题中获取示例日期范围。 2015年11月30日10:00和02-12-2015 15:00,我们生成以下分日日期范围:

30-11-2015 10:00 - 30-11-2015 24:00
01-12-2015 00:00 - 01-12-2015 24:00
02-12-2015 00:00 - 02-12-2015 15:00

现在,我们可以将7:00 - 22:00的时间范围应用于每个分割日期范围。

30-11-2015 10:00 - 30-11-2015 24:00 -> 12 hours
01-12-2015 00:00 - 01-12-2015 24:00 -> 15 hours
02-12-2015 00:00 - 02-12-2015 15:00 ->  8 hours

总共35个小时。实际计算可能是几分钟而不是几小时。

编辑添加:我创建了一个Time和一个TimeRange类来分别保存时间和日期时间范围。我使用了java.util.Date,虽然我必须创建自己的一天增量方法。

我将所有课程放在一起,这样我就可以轻松发布。这些类应放在单独的文件中。

package com.ggl.testing;

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

public class TimeRangeTest {

    private static final SimpleDateFormat inputDateFormat = new SimpleDateFormat(
            "dd-MM-yyyy");

    public static void main(String[] args) {
        TimeRangeTest test = new TimeRangeTest();
        int minutes = test.calculateTotalMinutes("30-11-2015 10:00",
                "02-12-2015 15:00", "07:00", "22:00");
        System.out.println(minutes + " minutes, " + (minutes / 60) + " hours");
    }

    public int calculateTotalMinutes(String startDateTimeString,
            String endDateTimeString, String startTimeString,
            String endTimeString) {
        try {
            List<TimeRange> timeRanges = generateTimeRanges(
                    startDateTimeString, endDateTimeString);
            return calculateTimeRange(timeRanges, startTimeString,
                    endTimeString);
        } catch (ParseException e) {
            e.printStackTrace();
            return 0;
        }
    }

    private List<TimeRange> generateTimeRanges(String startDateTimeString,
            String endDateTimeString) throws ParseException {
        Date startDate = inputDateFormat.parse(startDateTimeString.substring(0,
                10));
        Time startTime = new Time(startDateTimeString.substring(11));
        Date endDate = inputDateFormat
                .parse(endDateTimeString.substring(0, 10));
        Time endTime = new Time(endDateTimeString.substring(11));

        List<TimeRange> timeRanges = new ArrayList<>();

        Date currentDate = new Date(startDate.getTime());
        Time currentTime = new Time(startTime);
        Time eodTime = new Time("24:00");

        while (currentDate.compareTo(endDate) < 0) {
            TimeRange timeRange = new TimeRange(currentDate, currentTime,
                    eodTime);
            timeRanges.add(timeRange);
            currentTime = new Time("00:00");
            currentDate = new Date(currentDate.getTime() + 24L * 60L * 60L
                    * 1000L);
        }

        TimeRange timeRange = new TimeRange(currentDate, currentTime, endTime);
        timeRanges.add(timeRange);

        return timeRanges;
    }

    private int calculateTimeRange(List<TimeRange> timeRanges,
            String startTimeString, String endTimeString) {
        int count = 0;

        Time startTime = new Time(startTimeString);
        Time endTime = new Time(endTimeString);

        for (TimeRange timeRange : timeRanges) {
            Time sodTime = new Time(timeRange.getStartTime());
            Time eodTime = new Time(timeRange.getEndTime());
            Time sTime = startTime.max(sodTime);
            Time eTime = endTime.min(eodTime);

            count += eTime.difference(sTime);
        }

        return count;
    }

    public class TimeRange {

        private final SimpleDateFormat inputDateFormat = new SimpleDateFormat(
                "dd-MM-yyyy");

        private final Date date;

        private final Time startTime;
        private final Time endTime;

        public TimeRange(Date date, Time startTime, Time endTime) {
            this.date = date;
            this.startTime = startTime;
            this.endTime = endTime;
        }

        public Date getDate() {
            return date;
        }

        public Time getStartTime() {
            return startTime;
        }

        public Time getEndTime() {
            return endTime;
        }

        @Override
        public String toString() {
            return inputDateFormat.format(getDate()) + " "
                    + startTime.toString() + " -> " + endTime.toString();
        }

    }

    public class Time {

        private final int minutesPastMidnight;

        public Time(String timeString) {
            int hours = Integer.valueOf(timeString.substring(0, 2));
            int minutes = Integer.valueOf(timeString.substring(3, 5));
            this.minutesPastMidnight = hours * 60 + minutes;
        }

        public Time(Time time) {
            this.minutesPastMidnight = time.getMinutesPastMidnight();
        }

        private int getMinutesPastMidnight() {
            return minutesPastMidnight;
        }

        public int difference(Time time) {
            return this.getMinutesPastMidnight()
                    - time.getMinutesPastMidnight();
        }

        public Time min(Time time) {
            return (difference(time) > 0) ? time : this;
        }

        public Time max(Time time) {
            return (difference(time) > 0) ? this : time;
        }

        @Override
        public String toString() {
            int hours = minutesPastMidnight / 60;
            int minutes = minutesPastMidnight - (hours * 60);
            return String.format("%02d:%02d", hours, minutes);
        }
    }

}

答案 1 :(得分:0)

如果您使用java8,则可以使用LocalDateTime。然后你的代码看起来像这样:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTimeStart = LocalDateTime.parse("2015-10-01 10:00", formatter);
LocalDateTime dateTimeEnd = LocalDateTime.parse("2015-10-02 10:00", formatter);

long seconds = Duration.between(dateTimeStart, dateTimeEnd).getSeconds();

LocalTime如果你只有时间。然后它看起来像这样:

LocalTime timeStart = LocalTime.parse("07:00");
LocalTime timeEnd = LocalTime.parse("22:00");

long seconds = Duration.between(timeStart, timeEnd).getSeconds();

如果您不能使用java8,您可以使用getTime()方法获取自1970-01-01 00:00:00以来的毫秒数到您的日期并执行简单的减法操作,如下所示:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date dateStart = simpleDateFormat.parse("2015-10-01 10:00");
Date dateEnd = simpleDateFormat.parse("2015-10-02 10:00");

long milliseconds = dateEnd.getTime() - dateStart.getTime();
long seconds = resultInMillisecond / 1000;