Analysieren Sie die bisherige Zeichenfolge mit einem anderen Format in Java


91

Ich möchte konvertieren Stringzu Datein verschiedenen Formaten.

Beispielsweise,

Ich bekomme vom Benutzer,

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

Ich möchte dies fromDateals Datumsobjekt des "yyyy-MM-dd"Formats konvertieren

Wie kann ich das machen?


2
Ein Datumsobjekt hat kein Format, es ist nur eine Zahl, die das Datum darstellt. Das Datum kann durch einen String im Format "JJJJ-MM-TT" dargestellt werden.
user85421

Antworten:


181

Schau es dir an SimpleDateFormat. Der Code sieht ungefähr so ​​aus:

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
Kann ich anstelle des String-Formats eine Ausgabe im DateFormat erhalten?
Rachel

4
@ Rachel: Sicher, benutze es einfach parseund gehe nicht weiter format. parseanalysiert einen String auf ein Datum.
Michael Myers

3
Aber parsegibt mir in date formatals Fri Jan 06 00:01:00 EST 2012aber es braucht im 2012-01-06Datumsformat
Rachel

1
@Rachel liegt es daran, dass beim Aufrufen System.out.println(anyDateObject)der Standardmethode toString () aufgerufen wird, die in diesem Format gedruckt werden soll, z Fri Jan 06 00:01:00 EST 2012. Sie müssen es überschreiben, um Ihren Anforderungen zu entsprechen.
KNU

3
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque

13

tl; dr

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

Einzelheiten

Die anderen Antworten mit java.util.Date, java.sql.Dateund SimpleDateFormatsind jetzt veraltet.

LocalDate

Die moderne Art, Datum und Uhrzeit zu erstellen, besteht darin, speziell mit den Klassen java.time zu arbeiten LocalDate. Die LocalDateKlasse repräsentiert einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone.

DateTimeFormatter

Verwenden Sie die DateTimeFormatterKlasse , um eine Zeichenfolge zu analysieren oder zu generieren, die einen Datums- / Uhrzeitwert darstellt .

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

Kombinieren Sie ein Datums- / Uhrzeitobjekt nicht mit einem String, der seinen Wert darstellt. Ein Datums- / Uhrzeitobjekt hat kein Format , ein String dagegen. Ein Datum-Zeit - Objekt, beispielsweise LocalDatekann erzeugt einen String seinen internen Wert zu repräsentieren, aber das Datum Zeitobjekt und die Zeichenfolge sind getrennt verschiedene Objekte.

Sie können ein beliebiges benutzerdefiniertes Format angeben, um einen String zu generieren. Oder lassen Sie java.time die Arbeit der automatischen Lokalisierung erledigen.

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

Zur Konsole werfen.

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

ld: 2009-05-19 | Ausgabe: Karneval 19. Mai 2009

Sehen Sie in Aktion in IdeOne.com .


Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .


12

Verwenden Sie die SimpleDateFormatKlasse:

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

Verwendung:

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

Aus Effizienzgründen möchten Sie Ihre Formatierer in einer Hashmap speichern. Die Hashmap ist ein statisches Mitglied Ihrer util-Klasse.

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
VORBEHALT!! Die Idee ist gut, die Umsetzung aber nicht. DateFormats dürfen nicht statisch gespeichert werden, da sie nicht threadsicher sind! Wenn sie von mehr als einem Thread verwendet werden (und dies ist bei Statik immer riskant). FindBugs enthält einen Detektor dafür (den ich ursprünglich beigesteuert habe, nachdem ich gebissen wurde. Siehe dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller

Dein Blogeintrag ist eine interessante Lektüre :-) Was ist, wenn ich die parseDate-Methode selbst synchronisiert habe? Das Problem ist jedoch, dass es wahrscheinlich den Code verlangsamen würde ...
Agora

1
Solange die parseDate-Methode die einzige Methode war, die auf die Karte zugreift, würde die Synchronisierung funktionieren. Dies würde jedoch - wie Sie sagen - zu einem Engpass führen.
Daniel Schneller

8

Konvertieren Sie ein Zeichenfolgendatum 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

Während es SimpleDateFormatin der Tat für Ihre Bedürfnisse funktioniert, möchten Sie vielleicht auch Joda Time ausprobieren , das anscheinend die Grundlage für die überarbeitete Datumsbibliothek in Java 7 ist. Obwohl ich es nicht oft verwendet habe, habe ich nur gute Dinge gehört darüber und wenn Sie Daten in Ihren Projekten ausgiebig manipulieren, lohnt es sich wahrscheinlich, sie zu untersuchen.


1

Einfache Möglichkeit, ein Datum zu formatieren und in eine Zeichenfolge umzuwandeln

    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);

Ausgabe: Datum mit Format dd / mm / dd: 21.10.2015


1

Ein DateObjekt hat kein Format , es ist eine Darstellung. Das Datum kann von a Stringmit dem gewünschten Format angezeigt werden .

ZB " yyyy-MM-dd", " yy-MMM-dd", "dd-MMM-yy " usw.

Um dies zu erreichen, können Sie die verwenden SimpleDateFormat

Versuche dies,

        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();
        }

Diese Ausgabe: 2009-05-19


1

Angenommen, Sie haben eine Zeichenfolge wie diese:

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

Jetzt wollen wir dieses StringFormat in Java und Kotlin getrennt nach Datum und Uhrzeit ändern .

JAVA:

Wir haben eine Methode zum Extrahieren des Datums :

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 ist das: 17.09.2019

Und wir haben eine Methode zum Extrahieren der Zeit :

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;
}

Returnist das: 10:56 Uhr

KOTLIN:

wir haben eine Funktion zum Extrakt Datum :

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 ist das: 17.09.2019

Und wir haben eine Methode zum Extrahieren der Zeit :

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!!)
}

Returnist das: 10:56 Uhr


Bitte bringen Sie den Jungen nicht bei, die lange veraltete und notorisch problematische SimpleDateFormatKlasse zu benutzen . Zumindest nicht als erste Option. Und das nicht ohne Vorbehalt. Heute haben wir so viel besser in java.timeder modernen Java-API für Datum und Uhrzeit und deren DateTimeFormatter. Außerdem SimpleDateFormatkönnen 6 Dezimalstellen in Sekunden (Mikrosekunden) nicht korrekt analysiert werden.
Ole VV

Wenn ich Ihr zweites Snippet ausführe, erhalte ich nicht das, 10:56 AMwas Sie sagen, sondern 11:09 AM(getestet auf Oracle jdk-11.0.3).
Ole VV

@ OleV.V. , Wenn eine Methode lange veraltet ist, wird sie mit einer Linie als Zeichen veraltet sein. Wenn eine Methode oder Klasse nicht veraltet ist, können wir sie verwenden. Ich sage nicht, dass dies der beste Weg ist. Vielleicht haben wir einen besseren Weg, aber auf diese Weise ist einfach und verständlich, wenn eine Methode oder Klasse alt war, gibt es keinen Grund, dass es problematisch ist und für die Verwendung müssen DateTimeFormatterwir minsdk 26oder höher als es nicht gut ist
milad salimi

@ OleV.V. Aber danke für Ihren Kommentar und über Ihren zweiten Kommentar kann ich sagen, dass ich es viele Male in zwei Bewerbungen überprüfe und es zurückkehrt10:56 AM
milad salimi

1
@ OleV.V. , Ok, aber ich benutze eine Bibliothek, wenn ich keine Möglichkeit habe oder diese API (Bibliothek) sehr, sehr besser ist als mein Code, denn wenn Sie eine Bibliothek hinzufügen, fügen Sie Ihrem Projekt einige Codes hinzu, die möglicherweise nicht verwendet werden, und dies ist eine Überlastung für Ihr Projekt Projekt, das ist mein Ansatz und Ihr Ansatz ist für mich respektabel.
Milad Salimi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.