2015-12-01 53 views
3

假設我有兩個日期時間,30-11-2015 10:00和02-12-2015 15:00。我也有兩次,07:00和22:00。我如何計算在第二次之內的兩個日期/時間之間經過的時間量?使用日曆對象?這似乎很簡單,但它令我難以理解。計算日期時間之間的時間

+0

因此,對於第一個區間的所有日子,您想知道這些日子中有多少人有07-22時間間隔? –

+0

你到目前爲止嘗試過什麼?這似乎不是一個Java問題,而是一個解決問題的問題。想一想這些信息代表什麼,範圍可能如何重疊等。這可能有助於畫幾張照片讓自己開始。 – bstockwell

+0

'是在第二次'< - 不知道這意味着什麼,你能澄清嗎? – Taylor

回答

1

由於沒有其他答案包含可運行的代碼,我不知道他們是否能解決問題。

要計算的日期範圍內的時間範圍內的持續時間,你必須:

  • 斯普利特日期範圍劃分成多個日期範圍,每個跨度不超過一天。
  • 計算每個天時間範圍

服用例如時間範圍從提問內的時間範圍。 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); 
     } 
    } 

} 
+0

」將日期範圍分成多個日期範圍,每個日期範圍不超過一天。「和」計算每個日期範圍內的時間範圍「。就是這樣!謝謝! –

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; 
+0

謝謝,但我沒有java8 :-(它不適用於Android :( –

+0

@ 0ne_Up你可以隨時使用番石榴。任何方式,我添加到我的答案其他方式來計算日期之間的差異。 「 –