Imansible analizzare la stringa DateTime con il marcatore AM / PM

La stringa che voglio formattare si presenta così: String datetime = “9/1/10 11:34:35 AM”

Il seguente schema per SimpleDateFormat funziona:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss"); Date d = sdf.parse(datetime); System.out.println(d); Output> [Wed Sep 01 11:34:35 CEST 2010] 

Comunque ho bisogno di analizzare anche il marker AM / PM, e quando aggiungo che al pattern ricevo un’eccezione.

Modello che non funziona:

 SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a"); 

Ho provato con questo anche con la stessa eccezione:

 SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa"); 

Eccezione:

 java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM" 

Ho esaminato l’API all’indirizzo http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text ma non riesco a trovare dove sbaglio.

Eventuali suggerimenti?

Una possibilità è che le impostazioni Locale predefinite abbiano simboli diversi per AM / PM. Quando si costruisce un formato di data, è necessario fornire sempre una versione locale a meno che non si desideri realmente utilizzare le impostazioni Locale predefinite del sistema, ad esempio:

 SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US) 

Sto prendendo un esempio di data di seguito indicato e stampo la data formattata nel formato di 24 ore se si adatta alle tue esigenze.

  String inputdate="9/1/10 11:34:35 AM"; SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault()); try { System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate))); } catch (ParseException e) { e.printStackTrace(); } 

Se hai ancora qualche domanda, per favore rispondi. Grazie.

Se stai lavorando con FreeMarker per Java e fai il pop su questo problema usa sotto il codice. Ho avuto questo problema, il mio locale ha impostato AM / PM come DE. Non sai perché … <#setting locale="en_US">

Risposta moderna:

  String datetime = "9/1/10 11:34:35 AM"; LocalDateTime dt = LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH)); 

Questo produce un LocalDateTime del 2010-09-01T11: 34: 35. Attenzione però a due cifre; DateTimeFormatter assumerà dal 2000 al 2099. Per il mio compleanno questo sarebbe stato errato.

Dobbiamo ancora fornire le impostazioni internazionali. Poiché i marcatori AM / PM sono difficilmente utilizzati nella pratica in altre lingue oltre all’inglese, ho considerato Locale.ENGLISH una scommessa abbastanza sicura. Per favore sostituisci il tuo.

Le altre risposte sono state ottime risposte nel 2010 e nel 2011. Già nel 2014 quanto sopra era valido e avrei preferito farlo.