2012-01-25 8 views
7

Desidero calcolare la differenza tra due date/ora in java utilizzando le classi Date e Calendar. Il formato che ho è "2012-01-24 12:30:00 PM".Calcola la differenza di data/ora in Java considerando AM/PM

Ho implementato il mio metodo e anche google per funzionare con gli altri, ma non ho trovato il suggerimento giusto per gestire i valori di AM e PM.

La differenza di data/ora è stata disturbata ogni volta che l'ora ha 12 (AM/PM). Ad esempio se ho data/ora "2012-01-24 12:30:00 PM" e "2012-01-24 02:30:00 PM" mostra che la differenza è di 10 ore.

Considerando il codice su this link come può essere modificato per gestire AM e PM.

Per convertire data stringa in data Io uso seguente codice:

String sessionTimeStart = "2012-01-24 12:30:00 PM"; 
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM"; 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null; 
    Date d0 = null; 
    try { 
     d1 = format.parse(sessionTimeStart); 
     d0 = format.parse(sessionTimerEndOrCurrent); 
    } catch (ParseException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
+0

Come si converte la stringa in un oggetto 'Date'? E come calcoli la differenza? Se usi il codice che hai collegato, come lo chiami? – Thomas

+0

@Thomas Ho aggiornato il post – rizzz86

risposta

6

Il problema è il formato della data: anziché yyyy-MM-dd HH:mm:ss a utilizzare yyyy-MM-dd hh:mm:ss a.

HH sarà l'ora del giorno (0-23) mentre hh sarà l'ora in AM/PM (1-12). Quindi con il formato della data 02:30:00 verrà analizzato come tale invece di essere convertito alla versione PM (che nell'ora del giorno sarebbe 14:30:00).

+0

Penso che tu abbia ragione @Thomas. Proverò a cambiarlo in "hh" e a testare tutti i miei casi. – rizzz86

1

Non costruire da soli, utilizzare una libreria consolidata. Jodatime è ampiamente utilizzato.

+0

Grazie per il tuo suggerimento @questo. Ma come ho detto, devo usare le classi Date e Calendar. – rizzz86

1

onsider using Apache Commons DateUtils DurationFormatUtils formatPeriod method farà la magia.

Buona fortuna!

EDIT Supponendo di avere una data e Data b inizializzato a questo punto,

String format="HH:mm:ss.SSS"; // whatever you wish 
boolean padWithZeros=true; // whatever you wish 
TimeZone timezone=null; // whatever you wish 
long timeA = a.getTime(); 
long timeB = b.getTime(); 

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone); 
+0

Grazie per il tuo suggerimento @aviad. Ma come ho detto, devo usare le classi Date e Calendar. – rizzz86

+0

@ rizzz86, vedi la mia modifica. – aviad

-1

Calendar ha un add Methode() che può essere utilizzato per sottraendo troppo. Dai un'occhiata a questo. Dovresti utilizzare Calendar invece di Date perché la maggior parte delle operazioni Date sono deprecate.

+1

La domanda era sul calcolo della differenza non sul confronto. – aviad

+0

Spiacente, ho frainteso l'API. Thought compareTo() restituirebbe la differenza in Milliseconds. –

+0

Trovato un'altra soluzione. Forse quella giusta questa volta ;-) –

3

Quindi, hai queste date come stringhe? li Analizzare con un SimpleDateFormat con la stringa di formato appropriato, e calcolare la differenza in ore:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Date d1 = df.parse("2012-01-24 12:30:00 PM"); 
Date d2 = df.parse("2012-01-24 02:30:00 PM"); 

int hoursDifference = (int)((d2.getTime() - d1.getTime())/3600000L); 
System.out.println("Difference in hours: " + hoursDifference); 

Il tuo errore è che si sta utilizzando HH (ore 24-ore) invece di hh (12 ore ore) nella stringa di formato.

+0

Grazie a @Jesper, proverò anche la tua soluzione. Ma l'HH e HH sembra essere il caso che mi manchi qui – rizzz86

4

Il motivo per cui mostra 10 ore come differenza è che si ha un errore nel pattern durante l'analisi dell'input.

Ecco un esempio utilizzando SimpleDateFormat:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

Date date1 = df.parse("2012-01-24 12:30:00 PM"); 
Date date2 = df.parse("2012-01-24 02:30:00 PM"); 

long differenceInHours = Math.abs(date1.getTime() - date2.getTime())/1000/60/60); 

torneranno 10.

Quando abbiamo appena cambiamo un po 'il modello di formato della data, utilizzando hh per ora in am/pm (1-12) al posto di HH per un'ora a giorno (0-23):

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Esso restituisce (il previsto) 2.

Vedere lo documentation for SimpleDateFormat per ottenere i vostri modelli giusto.

Problemi correlati