2009-07-20 2 views
11

Perché l'analisi '23: 00 PM 'con SimpleDateFormat("hh:mm aa") restituisce 11 pm?Perché il parsing '23: 00 PM 'con SimpleDateFormat ("hh: mm aa") restituisce 11 am?

+1

sì ... quella domanda non ha nemmeno senso. immondizia, spazzatura. probabilmente hai ragione che aggiunge 12 ore internamente per "pm". – mpen

+0

@Peter: Beh, LO SO CHE !! In realtà ho scoperto qual era il problema dopo pochi minuti. Questa non è la domanda qui. (Hai mai eseguito il debug di codice di qualcun altro? Quindi ha senso.) – OscarRyz

risposta

22

Si dovrebbe ricevere un'eccezione, poiché "23:00 PM" non è una stringa valida, ma la funzione data/ora di Java è lenient per impostazione predefinita, quando si gestisce l'analisi della data.

La logica è che 23:00 è 12 ore dopo le 23:00, che è 11:00 il giorno seguente. Vedrai anche cose come "31 aprile" analizzate come "1 maggio" (un giorno dopo il 30 aprile).

Se non si desidera questo comportamento, impostare la proprietà lenient su false su SimpleDateFormat utilizzando DateFormat#setLenient(boolean) e si otterrà un'eccezione quando si passa in date/orari non validi.

+0

Ohh, ho già visto quella bandiera e non ho mai saputo che fosse tutto qui. : P (nè si preoccupa per questo) – OscarRyz

+5

Adesso? :) –

1

Direi che si fa qualcosa di simile:

hours = hours % 12; 

per garantire che le ore sono nell'intervallo corretto.

18

Si desidera "HH: mm aa" come formato, se si analizzerà l'intervallo di 24 ore.

public static void main(String[] args) throws ParseException { 
    SimpleDateFormat df = new SimpleDateFormat("HH:mm aa"); 
    final Date date = df.parse("23:00 PM"); 
    System.out.println("date = " + df.format(date)); 
} 

uscite

date = 23:00 PM 
+0

SimpleDateFormat df = new SimpleDateFormat ("HH: mm aa"); sta dando avvertimento sui pelucchi .. hai idea di come risolvere questo? – NovusMobile

+0

Satyam, qual è l'avviso? –

15

Hai provato HH:mm aa?

HH è per 24 ore mentre hh è per 12.

2

23:00 PM potrebbe essere pensato come 11:00 il giorno successivo. Javascript e PHP funzionano così ma non posso parlare per Java.

+0

Questo è quello che sembra stia accadendo. Yeap! – OscarRyz

4

Qui ci sono le opzioni di formattazione specifed nel javadoc

H  Hour in day (0-23)  
k Hour in day (1-24) 
K Hour in am/pm (0-11)  
h Hour in am/pm (1-12) 

Si noti che "h" sarebbe per ore 1-12. Se vuoi gestire 1-24, prova "k". per 0-23 prova "H". Ma non mi aspetterei risultati validi se si inseriscono dati impossibili.