2011-11-21 20 views
16

Ho bisogno di ottenere il numero di minuti tra due date. So che Joda è il migliore da usare, ma questo è per un progetto Android, quindi preferisco usare un po 'di librerie esterne il più possibile, e l'app che sto costruendo non richiede che il calcolo sia preciso dal punto di vista chirurgico.Differenza, in minuti, tra due date

Tuttavia, il codice che sto utilizzando non sembra funzionare. Sto cercando di ottenere il numero di minuti tra "11/11/2011 7:00:00 AM" e "11/11/2011 1:00:00 PM" (che dovrebbe essere 360 ​​minuti), ma il codice I 'm utilizzando restituisce 0:

int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM")); 

public static Date GetItemDate(final String date) 
{ 
    final Calendar cal = Calendar.getInstance(TimeZone.getDefault()); 
    final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a"); 
    format.setCalendar(cal); 

    try { 
     return format.parse(date); 
    } catch (ParseException e) { 
     return null; 
    } 
} 

public static int minutesDiff(Date earlierDate, Date laterDate) 
{ 
    if(earlierDate == null || laterDate == null) return 0; 

    return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
} 
+0

Lo fa? Non fa per me. Inoltre, perché stai facendo la divisione due volte? –

+2

Funziona perfettamente per me. L'output è -360. – Tyler

+0

Non so perché stai ottenendo zero, ma la stringa di formato è sbagliata. HH è il formato per l'ora tra 0 e 23, ma dal momento che hai anche il carattere di un formato, presumo che tu voglia che l'ora sia compresa tra 1 e 12, e dovresti usare hh. Attualmente, la tua 1:00:00 PM viene analizzata come 1:00:00. – Brigham

risposta

5

ho debug attraverso il tuo codice: c'è ParseException in GetItemDate() per entrambe le stringhe di data come:

Data di analizzarlo: 11/21/2011 07:00:00

Il il problema è che l'analisi delle ore AM/PM funziona solo con "hh" (maiuscoletto!) o "KK". Almeno questo è il caso nel mio telefono (sembra che alcuni di noi non abbiano visto questo problema). L'ho provato funziona anche con una sola "h".

hh = 1-12
KK = 0-11
HH = 0-23
kk = 1-24

cambiare la vostra linea di SimpleDateFormat a questo:

final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US); 


Questo post spiega la "a" e Locale: Unable to parse DateTime-string with AM/PM marker

PS. Vengo dalla Finlandia, quindi devo usare la parte "Locale.US" perché funzioni. I residenti degli Stati Uniti potrebbero testare il codice senza di esso, credo.

13

Se il GetItemDate sta fallendo sia per la data, si otterrà zero. Sull'istruzione catch, posiziona un println o debug per emettere il problema e vedere se questo ti dice qualcosa.

Inoltre, proprio come una questione di pratica, vorrei cambiare:

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 

a:

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
return (int) result; 

Questo vi dà la possibilità di visualizzare il risultato della matematica in un IDE.

+4

Molti (la maggior parte?) Gli IDE hanno la capacità di osservare i valori di ritorno delle funzioni, quindi la creazione di un * locale * solo per quello scopo non dovrebbe essere necessaria. Ancora non farei la divisione due volte. –

+0

Buona chiamata sul non fare divisione due volte. Non me ne sono nemmeno accorto. – Thom

+0

Probabilmente è meglio arrotondare e quindi lanciare in 'int', ma ciò dipende ovviamente dall'intenzione. 2 minuti 59 secondi e 4 minuti 0 secondi sono 59 secondi più vicini alla differenza di 1 minuto rispetto a 2. – Tom