2011-10-06 14 views
27

Co jest dobrym sposobem, aby, biorąc pod uwagę dwa obiekty Date, porównać różnicę między ich porcją czasu, całkowicie ignorując Rok, Miesiąc i Dzień?Porównaj tylko część czasu z dwóch dat, ignorując datę część

Jest to przeciwieństwo this question.

UPDATE: Oto kod końcowy do wykorzystania w przyszłości:

private long differenceBetween(Date currentTime, Date timeToRun) 
{ 
    Calendar currentCal = Calendar.getInstance(); 
    currentCal.setTime(currentTime); 

    Calendar runCal = Calendar.getInstance(); 
    runCal.setTime(timeToRun); 
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH)); 
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH)); 
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR)); 

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis(); 
} 
+2

Tak, tak. Dlaczego by tego nie robił? – kolrie

+0

Ironia tego rozwiązania polega na tym, że bierzesz dwa obiekty, które są cienkimi opakowaniami wokół typu podstawowego, wywołują masywny i złożony interfejs API, przekształcając obiekty długie w obiekty kalendarza ... i kończą z powrotem w miejscu, w którym " ponownie konwertuje z obiektów kalendarza na długie. – scottb

+0

@scottb - Zobacz [moja odpowiedź] (http://stackoverflow.com/questions/7676149#7676307) poniżej, która nie zmiata z obiektami 'Calendar', ale używa tylko elementów' Date'. –

Odpowiedz

29

Jeśli chcesz porównać podstawowych binarnych (long int) wartości dat, można to zrobić:

public int compareTimes(Date d1, Date d2) 
{ 
    int  t1; 
    int  t2; 

    t1 = (int) (d1.getTime() % (24*60*60*1000L)); 
    t2 = (int) (d2.getTime() % (24*60*60*1000L)); 
    return (t1 - t2); 
} 

Dodatek 1

Ta technika ma tę przewagę, że wykorzystuje bezpośrednio wartość obiektu long obiektów Date zamiast konwersji między tykami a komponentami kalendarza (który jest raczej drogi i wolny). Jest to również o wiele prostsze niż zgranie z obiektami Calendar.

Uzupełnienie 2

Powyższy kod zwróci różnicę czasu jako int, które będą odpowiednie dla każdej pary razy, ponieważ ignoruje porcje rok/miesiąc/dzień terminach w całości, a różnica między dwoma dowolnymi czasami wynosi nie więcej niż 86 400 000   ms (=   1000 ms/sek. × 60 sekund/minutę × 60 minut/godzinę × 24 godziny/dzień).

+0

To jest najlepsza odpowiedź, imo. Nie ma potrzeby używania złożonego interfejsu API Kalendarza do porównywania wartości czasu w obiektach Date. – scottb

+0

to jest idealne i inteligentne –

+0

thnx David, dokładnie to, czego szukałem :) –

5

Spójrz na klasy Calendar. Obsługuje on wyodrębnianie godzin, minut i sekund z podanych Date.

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(yourDateObject); 
int hour = calendar.get(Calendar.HOUR); 
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
+0

Kalendarz.HOUR_OF_DAY jest bardziej odpowiedni (24 godziny niż 12) – IHeartAndroid

1

W przypadku, gdy nie można użyć Joda,

utworzyć 2 obiektów kalendarza ustaw rok, miesiąc i dzień 0.

porównać je ....

19

Użytkownik może rozważ użycie czasu Jody DateTimeComparator.getTimeOnlyInstance() dla komparatora, który porówna dwa daty Joda oparte tylko na czasie.

Na przykład:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance(); 
comparator.compare(date1, date2); 

Zobacz http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()

+0

Jeśli czas (java) jest pytanie, JODA jest odpowiedź: D – bbaja42

+0

@ bbaja42 Nie używasz GWT:/ – displayname

1

Jeśli JODA nie jest opcją, jednym z najkrótszych podejść jest prawdopodobnie zamiana czasu na ciągi, a następnie ich porównanie.

DateFormat df = new SimpleDateFormat("HHmmssSZ"); 
df.format(date1).equals(df.format(date2)); 
0

Nie wiem, jak dobrze to działa lub jest skuteczny, ale napisałem prostą funkcję przy użyciu obiektu Date, który służy moim celom. Zwraca wartość true lub false jest pierwszą wartością daty większą niż druga. Wejścia d1 & & d2 są obiektami Date.

function CompareTimes(d1, d2) { 
      if (d1.getHours() < d2.getHours()) { 
       return false; 
      } 
      if (d1.getHours() > d2.getHours()) { 
       return true; 

      } else { 
       return (d1.getMinutes() > d2.getMinutes()); 
      } 
}; 
0

jeśli po prostu chcesz porównać razem część terminach wtedy to daje odpowiednią Wynik -

public long compareTimes(Date d1, Date d2) 
    { 
     long  t1; 
     long  t2; 
     t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds(); 
     t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds(); 
     long diff = t1-t2; 
     System.out.println("t1 - "+t1+", t2 - "+t2+", diff - "+diff); 

     return diff; 
    } 
Powiązane problemy