Modifica del formato della data della stringa

il mio formato attuale è: 08/11/2008 00:00

Ho bisogno di convertire questo output in 2008/11/08 00:00 Tuttavia, utilizzando SimpleDateFormat come ricercato non è in grado di farlo e mi dà un output completamente diverso, ecco i miei codici come segue:

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") Date starting= simpleDateFormat2.parse(startTime); System.out.println("" + simpleDateFormat2.format(starting) + " real date " + startTime); 

so che sto analizzando nella stringa giusta dato che si verifica il seguente output:

 0014/05/01 00:00 real date 08/11/2008 00:00 

non sono troppo sicuro di come per quanto riguarda i meccanismi rilevati 0014/05/01 00:00 anziché

2008/11/08 00:00

Non vedo l’ora di tutti i sugguestions Grazie in anticipo

La prima cosa che devi fare è analizzare il valore originale su un object Date

 String startTime = "08/11/2008 00:00"; // This could be MM/dd/yyyy, you original value is ambiguous SimpleDateFormat input = new SimpleDateFormat("dd/MM/yyyy HH:mm"); Date dateValue = input.parse(startTime); 

Una volta che hai fatto, puoi formattare il dateValue qualsiasi modo tu voglia …

 SimpleDateFormat output = new SimpleDateFormat("yyyy/MM/dd HH:mm"); System.out.println("" + output.format(dateValue) + " real date " + startTime); 

quali uscite:

 2008/11/08 00:00 real date 08/11/2008 00:00 

Il motivo per cui 0014/05/01 00:00 è SimpleDateFormat (quando si utilizza yyyy/MM/dd HH:mm ) usa 08 per l’anno, 11 per il mese e 2008 per il giorno, sta facendo una rotazione interna dei valori per correggere i valori in una data valida

È perché la stringa di data di origine che hai analizzato è in un formato diverso rispetto a SimpleDateFormatter. La tua fonte è in MM/dd/yyyy HH:mm . Modificare la stringa in SimpleDateFormat in MM/dd/yyyy HH:mm .

Prova a utilizzare un altro formato dopo il primo formato.

 SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("MM/dd/yyyy HH:mm"); //You gotta parse it to a Date before correcting it Date parsedDate = simpleDateFormat2.parse(startTime); simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") String newFormatttedDate = simpleDateFormat2.format(parsedDate); 

Vorrei contribuire con la risposta moderna.

  DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm"); DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm"); String startTime = "08/11/2008 00:00"; LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter); System.out.println(starting.format(convertedOutputFormatter)); 

Questo stampa

 2008/11/08 00:00 

La class SimpleDateFormat hai provato ad usare è obsoleta e notoriamente problematica. Hai provato solo un po ‘di problemi con esso. Invece sto usando e raccomandando java.time , la moderna API di data e ora Java.

Come altri hanno già detto, è necessario utilizzare due formattatori, uno per specificare il formato corrente e uno per specificare il formato desiderato.

Cosa è andato storto nel tuo codice?

Il tuo formattatore con il modello di formato yyyy/MM/dd HH:mm interpretato l’8/08/2008 come il 2008esimo giorno dell’undicesimo mese dell’anno 8 dell’era comune. Non disturba un SimpleDateFormat con le impostazioni predefinite che ci sono solo 30 giorni a novembre, continua semplicemente a contare nei seguenti mesi e anni, finendo in una data di cinque anni e mezzo dopo (il 2008 diviso per 365.25 è molto vicino a 5.5).

Domanda: Posso usare java.time con la mia versione di Java?

Se si utilizza almeno Java 6 , è ansible.

  • In Java 8 e versioni successive, la nuova API è integrata.
  • In Java 6 e 7 si ottiene il ThreeTen Backport, il backport delle nuove classi (ThreeTen per JSR 310, in cui la moderna API è stata descritta per la prima volta).
  • Su Android (più vecchio), usa l’edizione Android di ThreeTen Backport. Si chiama ThreeTenABP. Assicurati di importare le classi di data e ora dal pacchetto org.threeten.bp e org.threeten.bp .

link

  • Tutorial di Oracle: Date Time , che spiega come utilizzare java.time .
  • Progetto ThreeTen Backport
  • ThreeTenABP , versione Android di ThreeTen Backport
  • Domanda: Come usare ThreeTenABP nel progetto Android , con una spiegazione molto approfondita.
  • Java Specification Request (JSR) 310 .

Stai analizzando la data 08/11/2008 00:00 con il formato yyyy/MM/dd HH:mm ma questa data non è in questo formato.