2011-10-06 11 views
27

Qual è un buon metodo per, dato due oggetti Data, confrontare la differenza tra la loro parte solo tempo, ignorando completamente Anno, Mese e Giorno?Confrontare solo la parte di tempo di due date, ignorando la parte di data

È esattamente l'opposto di this question.

UPDATE: Ecco il codice finale per riferimento futuro:

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

Sì, lo fa. Perché no? – kolrie

+0

L'ironia di questa soluzione è che prendi due oggetti che sono involucri sottili attorno a una primitiva di tipo lungo, invoca un'API massiccia e complessa per convertire da oggetti lunghi a oggetti di Calendar ... solo per ritrovarti in un posto dove sei tu convertendo nuovamente da oggetti Calendar a longs. – scottb

+0

@scottb - Vedere di seguito [la mia risposta] (http://stackoverflow.com/questions/7676149#7676307), che non interferisce con gli oggetti 'Calendar' ma usa solo i membri di' Date'. –

risposta

29

Se si desidera confrontare i valori sottostanti binari (long int) delle date, si può fare questo:

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

Addendum 1

Questa tecnica ha il vantaggio della velocità, poiché utilizza direttamente il valore long sottostante degli oggetti Date, invece di convertire tra tick e componenti del calendario (che è piuttosto costoso e lento). È anche molto più semplice che fare scherzi con gli oggetti Calendar.

Addendum 2

Il codice precedente restituisce la differenza di tempo come un int, che sarà corretto per ogni paio di volte, in quanto ignora le porzioni anno/mese/giorno della data del tutto, e la differenza tra due volte non superiore a 86.400.000   ms (=   1000 ms/sec × 60 sec/min × 60 minuti/ora × 24 ore/giorno).

+0

Questa è la migliore risposta, imo. Non è necessario utilizzare un'API di calendario complessa per confrontare i valori temporali all'interno degli oggetti Date. – scottb

+0

questo è perfetto e intelligente –

+0

thnx david, esattamente quello che stavo cercando :) –

5

Date un'occhiata alla classe Calendar. Ha il supporto per l'estrazione di ore, minuti e secondi dal dato 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

Calendar.HOUR_OF_DAY è più appropriato (24 ore anziché 12) – IHeartAndroid

1

Nel caso in cui non è possibile utilizzare JODA,

creare 2 oggetti di calendario, l'anno insieme, mese e giorno a 0.

Confrontarli ....

19

Si può considera l'utilizzo di Joda time DateTimeComparator.getTimeOnlyInstance() per un comparatore che confronterà due date Joda basate solo sui tempi.

Ad esempio:

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

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

+0

Se (java) è la domanda, JODA è la risposta: D – bbaja42

+0

@ bbaja42 Non si utilizza GWT:/ – displayname

1

Se JODA non è un'opzione, uno degli approcci più brevi è probabilmente per convertire il tempo in stringhe e quindi confrontarle.

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

non so come buona praticata o efficiente è questo, ma ho scritto una funzione semplice utilizzando l'oggetto Date che serve i miei scopi. Restituisce un vero o falso è il primo valore di data più grande del secondo. Gli ingressi d1 & & d2 sono oggetti Data.

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

se si desidera solo per confrontare la parte di tempo delle date, allora questo darebbe il giusto risultato -

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; 
    } 
Problemi correlati