2016-04-06 11 views
0

2つのタイムスロットに共通する時間を計算する必要があります。私はこれを計算する効率的な方法があるかどうかを知りたがっていました。私はintで時間を節約するのが最善の方法ではないことを知っています。誰かが私にそれを保存し、それを計算する新しい方法を提案することができますか?2つのTimeSlotが共通に持つ時間を計算する

利用可能なタイムスロットが2つオーバーラップしている期間を計算する必要があります。たとえば、木曜日の10:00から13:00までの最初の利用可能なタイムスロットと、木曜日の12:00から14:00までのもう1つのタイムスロットがある場合、どちらの時間が使用可能であるかを計算できます。

public class TimeSlot implements Cloneable { 

    int day; 
    int hourStart; 
    int hourEnd; 
    int minutesStart; 
    int minutesEnd; 
    int id; 

    public TimeSlot(int day, int hourStart, int hourEnd, int minutesStart, int minutesEnd) { 
     this.day = day; 
     this.hourStart = hourStart; 
     this.hourEnd = hourEnd; 
     this.minutesStart = minutesStart; 
     this.minutesEnd = minutesEnd; 
     this.id = AutoIDGenerator.getAutoIdTimeSlot(); 

    } 

    @Override 
    protected TimeSlot clone() throws CloneNotSupportedException { 
     return (TimeSlot) super.clone(); 
    } 

    public boolean isTheSameDay(TimeSlot t) { 
     if (this.getDay() == t.getDay()) { 
      return true; 
     } 
     return false; 
    } 

    /** 
    * 
    * @param t 
    * @return si l'heure fournie est après this timeslot 
    */ 
    public boolean isAfter(TimeSlot t) { 
     if (this.isTheSameDay(t)) { 
      if (this.getHourEnd() > t.getHourStart()) { 
       return true; 
      } else if (this.getHourEnd() == t.getHourStart() && this.getMinutesEnd() > t.getMinutesStart()) { 
       return true; 
      } 

     } 
     return false; 
    } 

    /** 
    * 
    * @param t 
    * @return si l'heure fournie est avant this timeslot 
    */ 
    public boolean isBefore(TimeSlot t) { 
     if (this.isTheSameDay(t)) { 
      if (this.getHourStart() > t.getHourEnd()) { 
       return true; 
      } else if ((this.getHourStart() == t.getHourEnd()) && (this.getMinutesStart() > t.getMinutesEnd())) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public boolean isCompatible(TimeSlot t) { 
     if (!(isBefore(t)) && !(isAfter(t))) { 
      return true; 
     } 
     return false; 

    } 
} 
+0

共通点はどういう意味ですか? –

+0

2つのタイムスロットが重なっている期間を計算する必要があります。たとえば、木曜日の10時から13時までの最初のタイムスロットと、木曜日の12時から2時までの別のタイムスロットがある場合、私たちはどれだけ時間がかかりますかを計算できます。それで、私が追加する必要があるもの – LaMoule

答えて

1

を任意の精度のためのソリューションを持つことができ、それはan overlap methodInterval classを有していますあなたが必要とするものを正確に行います。あなたは、Java 8でのJava 8

を使用する場合は、あなたのクラスは次のようになりInstantでのJava 7以前かを使用している場合

第二に最善の解決策は、どちらかDateで、適切な日付表現を用いることであろう:

class Timeslot { 
    Instant start, end; 

    Duration overlap(Timeslot other) { 
    long startOverlap = Math.max(this.start.toEpochMilli(), other.start.toEpochMilli()); 
    long endOverlap = Math.min(this.end.toEpochMilli(), other.end.toEpochMilli()); 
    if (endOverlap <= startOverlap) return Duration.ofMillis(0); //or a negative duration? 
    else return Duration.ofMillis(endOverlap - startOverlap); 
    } 
} 
0

私は、彼らは、あなたが4つの日付を定義する必要が 、これを解決する最善かつ快適な方法は、日付を使用していると思わ: イベントAは、時間、イベント終了時間を開始し、イベントBは、開始時間、イベントB MM:SS形式

ので、HHにmillisecodsでその違いをフォーマットどのくらい(ミリ秒単位でよさそうだ)、そして最後に計算した場合にこれらの日付

でoverlapingsがある場合、終了時間、そして

をチェック例:2イベントの間に1時00分00秒

は、私は私が得た願っています

定義:

long millis = 0; 

Date eventOneBegin = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-4-06 06:00:00"); 
Date eventOneEnd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-4-06 09:00:00"); 
Date eventTwoBegin = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-4-06 08:00:00"); 
Date eventTwoEnd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-4-06 11:00:00"); 

if (eventOneEnd.getTime()>eventTwoBegin.getTime()) { 
    System.out.println("there is a overlap time"); 
    millis = eventOneEnd.getTime()-eventTwoBegin.getTime(); 
}else{ 
    System.out.println("there is NO overlap time...."); 
} 
String lapse=String.format("%02d:%02d:%02d", 
     TimeUnit.MILLISECONDS.toHours(millis), 
     TimeUnit.MILLISECONDS.toMinutes(millis) - 
     TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line 
      TimeUnit.MILLISECONDS.toSeconds(millis) - 
      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); 
System.out.println("Time overlap is: "+lapse); 

この例では、この

時間の重複がある生成質問:

0

最も良い方法は、java.util.Calendar java.util.Calendarクラスを使用することです。

タイムスロットは、開始時間と終了時間の2つのカレンダー値で定義できます。 カレンダー時間のミリ秒よりも長く動作します(getTimeInMillis()メソッドを使用)。あなたはジョダ時間を使うことができた場合のタイムスロットのためのjava.util.Calendarを使用して

、あなたは(...日、時、分)

関連する問題