假設我有兩個日期時間,30-11-2015 10:00和02-12-2015 15:00。我也有兩次,07:00和22:00。我如何計算在第二次之內的兩個日期/時間之間經過的時間量?使用日曆對象?這似乎很簡單,但它令我難以理解。計算日期時間之間的時間
回答
由於沒有其他答案包含可運行的代碼,我不知道他們是否能解決問題。
要計算的日期範圍內的時間範圍內的持續時間,你必須:
- 斯普利特日期範圍劃分成多個日期範圍,每個跨度不超過一天。
- 計算每個天時間範圍
服用例如時間範圍從提問內的時間範圍。 30-11-2015 10:00和2015年2月12日下午3點,我們產生了以下拆分當天日期範圍:
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);
}
}
}
」將日期範圍分成多個日期範圍,每個日期範圍不超過一天。「和」計算每個日期範圍內的時間範圍「。就是這樣!謝謝! –
如果使用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;
謝謝,但我沒有java8 :-(它不適用於Android :( –
@ 0ne_Up你可以隨時使用番石榴。任何方式,我添加到我的答案其他方式來計算日期之間的差異。 「 –
- 1. 計算日期之間的時間差
- 2. 計算日期時間之間的總時間
- 3. 計算兩個日期時間字符串之間的時間
- 4. 計算兩個日期時間之間的時間
- 5. 計算兩個日期之間的日間時間和夜間時間
- 6. 我需要計算一個日期時間列之間的日期/時間差
- 7. 計算不同行兩個日期之間的時間間隔
- 8. 計算2日期和時間之間的小時和分鐘
- 9. MySQL日期/時間計算
- 10. mysql日期/時間計算
- 11. 時間/日期計算
- 12. 計算日期/時間PHP
- 13. 時間/日期計算
- 14. Excel - 計算日期時間
- 15. dos日期/時間計算
- 16. 日期時間計算C#
- 17. 日期之間的日期與時間
- 18. 日期時間/日期扣除計算
- 19. 計算輸入的日期和時間之間的差異?
- 20. 計算在pyspark的兩個日期之間的時間
- 21. 在日期之間計算
- 22. 計算僅在工作時間內日期之間所花費的時間
- 23. 如何計算jQuery中2個日期時間值之間的時間差
- 24. 計算所有記錄中兩個日期時間之間的平均時間?
- 25. 計算每天兩個日期之間的時間
- 26. 如何計算兩個日期之間的時間差 - MySql
- 27. ActionScript 3.0 +計算兩個日期之間的時間跨度?
- 28. 根據用戶名稱計算日期之間的時間
- 29. 使用GDate來計算日期之間的時間
- 30. 計算兩個日期之間傳遞的時間量
因此,對於第一個區間的所有日子,您想知道這些日子中有多少人有07-22時間間隔? –
你到目前爲止嘗試過什麼?這似乎不是一個Java問題,而是一個解決問題的問題。想一想這些信息代表什麼,範圍可能如何重疊等。這可能有助於畫幾張照片讓自己開始。 – bstockwell
'是在第二次'< - 不知道這意味着什麼,你能澄清嗎? – Taylor