Analizza la stringa fino alla data con un formato diverso in Java


91

Voglio convertire Stringin Datein diversi formati.

Per esempio,

Sto ricevendo dall'utente,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

Voglio convertirlo fromDatecome un oggetto Date di "yyyy-MM-dd"formato

Come posso fare questo?


2
Un oggetto Date non ha formato, è solo un numero che rappresenta la data. La data può essere rappresentata da una stringa con il formato "aaaa-MM-gg".
user85421

Risposte:


181

Dai un'occhiata SimpleDateFormat. Il codice è qualcosa del genere:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}

1
invece di ottenere il formato stringa, posso ottenere l'output in Dateformato?
Rachel

4
@ Rachel: certo, usa parsee non andare avanti format. parseanalizza una stringa in una data.
Michael Myers

3
Ma parsemi dà dentro date formatcome, Fri Jan 06 00:01:00 EST 2012ma ha bisogno del 2012-01-06formato della data
Rachel

1
@ Rachel è perché quando chiami System.out.println(anyDateObject)il metodo predefinito toString () viene chiamato che è stato detto stampare in quel formato, ad es Fri Jan 06 00:01:00 EST 2012. È necessario sovrascriverlo in base alle proprie esigenze.
KNU

3
Cordiali saluti, le vecchie e fastidiose classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatsono ora legacy , soppiantate dalle classi java.time incorporate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Basil Bourque

13

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

Dettagli

Le altre risposte con java.util.Date, java.sql.Datee SimpleDateFormatsono ormai superate.

LocalDate

Il modo moderno di fare data-ora è lavorare con le classi java.time, in particolare LocalDate. La LocalDateclasse rappresenta un valore di sola data senza ora del giorno e senza fuso orario.

DateTimeFormatter

Per analizzare o generare una stringa che rappresenta un valore di data e ora, utilizzare la DateTimeFormatterclasse.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

Non confondere un oggetto data-ora con una stringa che ne rappresenta il valore. Un oggetto data-ora non ha formato , mentre un oggetto String sì. Un oggetto data-ora, ad esempio LocalDate, può generare una stringa per rappresentarne il valore interno, ma l'oggetto data-ora e la stringa sono oggetti distinti separati.

È possibile specificare qualsiasi formato personalizzato per generare una stringa. Oppure lascia che java.time si occupi della localizzazione automatica.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

Scarica su console.

System.out.println( "ld: " + ld + " | output: " + output );

ld: 2009-05-19 | uscita: martedì 19 maggio 2009

Guarda in azione su IdeOne.com .


Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*classi.

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 e versioni successive
    • Incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte delle funzionalità java.time sono portate indietro a Java 6 e 7 in ThreeTen-Backport .
  • Android
    • Versioni successive delle implementazioni di bundle Android delle classi java.time.
    • Per precedenza Android (<26), il ThreeTenABP progetto si adatta ThreeTen-Backport (di cui sopra). Vedi Come usare ThreeTenABP… .

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


12

Usa la SimpleDateFormatclasse:

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

Utilizzo:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

Per maggiore efficienza, ti consigliamo di archiviare i tuoi formattatori in una hashmap. La hashmap è un membro statico della tua classe util.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}

9
AVVERTIMENTO!! L'idea è buona, ma l'implementazione no. DateFormats non devono essere archiviati staticamente, perché non sono thread-safe! Se vengono utilizzati da più thread (e questo è sempre rischioso con la statica). FindBugs contiene un rilevatore per questo (a cui mi è capitato di contribuire inizialmente, dopo essere stato morso. Vedi dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller

Il tuo post sul blog è una lettura interessante :-) E se il metodo parseDate stesso venisse sincronizzato? Il problema però è che probabilmente rallenterebbe il codice ...
Agora

1
Finché il metodo parseDate era l'unico metodo ad accedere alla mappa, la sincronizzazione avrebbe funzionato. Tuttavia questo, come dici tu, introdurrebbe un collo di bottiglia.
Daniel Schneller

8

Converte una data stringa in java.sql.Date

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010


3

Sebbene SimpleDateFormatfunzionerà davvero per le tue esigenze, potresti anche voler dare un'occhiata a Joda Time , che apparentemente è la base per la libreria Date rifatta in Java 7. Anche se non l'ho usata molto, non ho sentito altro che cose buone e se manipoli ampiamente le date nei tuoi progetti, probabilmente varrebbe la pena esaminarlo.


1

Modo semplice per formattare una data e convertirla in stringa

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

output: Data con formato gg / mm / gg: 21/10/2015


1

Un Dateoggetto non ha formato , è una rappresentazione. La data può essere presentata da un Stringcon il formato che preferisci .

Ad esempio " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" e così via.

Per ottenere questo risultato puoi utilizzare il file SimpleDateFormat

Prova questo,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

Questo esce: 2009-05-19


1

Supponi di avere una stringa come questa:

String mDate="2019-09-17T10:56:07.827088"

Ora vogliamo modificare questo Stringformato di data e ora separate in Java e Kotlin .

GIAVA:

abbiamo un metodo per la data di estrazione :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return è questo: 17/09/2019

E abbiamo un metodo per l'estrazione del tempo :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnè questo: 10:56

KOTLIN:

abbiamo una funzione per la data di estrazione :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return è questo: 17/09/2019

E abbiamo un metodo per l'estrazione del tempo :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnè questo: 10:56


Per favore, non insegnate ai giovani a usare la SimpleDateFormatclasse antiquata e notoriamente fastidiosa . Almeno non come prima opzione. E non senza alcuna riserva. Oggi abbiamo molto di più java.time, la moderna API di data e ora Java e le sue DateTimeFormatter. Inoltre, SimpleDateFormatnon è possibile analizzare correttamente 6 decimali sui secondi (microsecondi).
Ole VV

Quando eseguo il tuo secondo snippet, non ottengo 10:56 AMcome dici che dovrei, ma invece 11:09 AM(testato su Oracle jdk-11.0.3).
Ole VV

@ OleV.V. , Se un metodo è obsoleto da tempo, sarà deprecato con una linea sopra come segno, se un metodo o una classe non è deprecato possiamo usarlo, non dico che sia il modo migliore, forse abbiamo un modo migliore ma in questo modo è semplice e comprensibile, se un metodo o una classe erano vecchi non c'è motivo per cui sia fastidioso e per l'uso di cui DateTimeFormatterabbiamo bisogno minsdk 26o superiore non è una buona cosa
milad salimi

@ OleV.V. Ma grazie per il tuo commento e per il tuo secondo commento posso dire che lo controllo molte volte in due applicazioni e ritorna10:56 AM
milad salimi

1
@ OleV.V. , Ok ma uso una libreria quando non ho modo o quell'API (libreria) è molto migliore del mio codice, perché quando aggiungi una libreria aggiungi alcuni codici al tuo progetto che potrebbero non essere utilizzati e questo è un sovraccarico per il tuo progetto, questo è il mio approccio e il tuo approccio è rispettabile per me.
milad salimi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.