Come analizzare una data? [duplicare]
-
14-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- stringa di Java per data di conversione 13 risposte
Sto cercando di analizzare questa data con SimpleDateFormat
e non funziona:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Formaterclass {
public static void main(String[] args) throws ParseException{
String strDate = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date dateStr = formatter.parse(strDate);
String formattedDate = formatter.format(dateStr);
System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
Date date1 = formatter.parse(formattedDate);
formatter = new SimpleDateFormat("dd-MMM-yyyy");
formattedDate = formatter.format(date1);
System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
}
}
Se provo questo codice con strDate = "2008-10-14"
, ho una risposta positiva. Qual è il problema? Come posso analizzare questo formato?
PS. Ho avuto questa data da un jDatePicker
e non c'è istruzioni su come modificare il formato della data che provo quando l'utente sceglie una data.
Soluzione
Non si può pretendere di analizzare un appuntamento con una SimpleDateFormat che è impostato con un formato diverso.
Per analizzare la data stringa "Gio 18 Giu 20:56:02 EDT 2009" è necessario un SimpleDateFormat come questo (più o meno):
SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Usare questo per analizzare la stringa in una data, e poi l'altra SimpleDateFormat per trasformare quella Data nel formato che si desidera.
String input = "Thu Jun 18 20:56:02 EDT 2009";
SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Date date = parser.parse(input);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(date);
...
JavaDoc: http://docs.oracle. com / JavaSE / 7 / docs / api / java / text / SimpleDateFormat.html
Altri suggerimenti
Il problema è che si dispone di una data formattata in questo modo:
Thu Jun 18 20:56:02 EDT 2009
Ma si utilizza un SimpleDateFormat
che è:
yyyy-MM-dd
I due formati non sono d'accordo. È necessario costruire una SimpleDateFormat
che corrisponde al il layout della stringa che si sta cercando di analizzare in una data. Fodera le cose per rendere più facile da vedere, si vuole un SimpleDateFormat
in questo modo:
EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009
Controlla la pagina JavaDoc ho collegato e vedere come vengono utilizzati i caratteri.
Ora abbiamo un modo più moderno di fare questo lavoro.
java.time
Il quadro java.time è fornito in bundle con Java 8 e successive. Vedere Tutorial . Queste nuove classi sono ispirati da Joda Time , definito da JSR 310 , ed esteso dal ThreeTen-Extra progetto. Si tratta di un grande miglioramento rispetto alle vecchie classi fastidiosi, java.util.Date/.Calendar et al.
Si noti che i 3-4 codici alfabetici come EDT
non sono né standardizzati, né unica. li Evitare per quanto possibile. Imparare ad usare ISO 8601 formati standard invece. Il quadro java.time può prendere una pugnalata a tradurre, ma molti dei codici comunemente usati hanno valori duplicati.
A proposito, notare come java.time di default genera stringhe utilizzando l'ISO 8601 formati, ma esteso aggiungendo il nome del fuso orario tra parentesi.
String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );
Dump per consolare.
System.out.println ( "zdt : " + zdt );
Quando run.
zdt: 2009-06-18T20: 56: 02-04: 00 [America / New_York]
Regola fuso orario
Per il divertimento cerchiamo di regolare al fuso orario dell'India.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Asia / Kolkata]
Converti in j.u.Date
Se si ha realmente bisogno di un oggetto java.util.Date per l'utilizzo con le classi non ancora aggiornati per i tipi java.time, convertire. Si noti che si stanno perdendo il fuso orario assegnato, ma hanno lo stesso momento regolata automaticamente per UTC .
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Come su getSelectedDate ? In ogni caso, in particolare sulla sua domanda di codice, il problema è con questa linea:
new SimpleDateFormat("yyyy-MM-dd");
La stringa che va nel costruttore deve corrispondere il formato della data. La documentazione per il modo per farlo è quello href="http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html" qui . Sembra che avete bisogno di qualcosa di simile a "EEE MMM d hh: mm: ss zzz yyyy"
In risposta a: " Come convertire gio 13 Settembre 2016 00:00:00 GMT-0500 (Hora de verano centrale (Mexico)) a gg-mm-aa in Java? ", che è stato caratterizzato come duplicato
Prova questo:
Con java.util.Date
, java.text.SimpleDateFormat
, si tratta di una soluzione semplice.
public static void main(String[] args) throws ParseException {
String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
Date f = new Date(fecha);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
fecha = sdf.format(f);
System.out.println(fecha);
}