gpt4 book ai didi

java - 计算日期时间之间的时间

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:29 24 4
gpt4 key购买 nike

假设我有两个日期时间,30-11-2015 10:00 和 02-12-2015 15:00。我也有两个时间,07:00 和 22:00。我如何计算第二次内的两个日期/时间之间耗时量?使用日历对象?这看起来很简单,但让我感到困惑。

最佳答案

由于其他答案均不包含可运行代码,因此我无法判断它们是否解决了问题。

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

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

从问题中获取示例日期范围。 30-11-2015 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,尽管我必须创建自己的每日增量方法。

我把所有的类(class)放在一起,这样我就可以更轻松地发布这个。这些类应该放在单独的文件中。

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);
}
}

}

关于java - 计算日期时间之间的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030034/

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