Konvertieren Sie java.util.Date in String


407

Ich möchte ein java.util.DateObjekt Stringin Java in ein konvertieren .

Das Format ist 2010-05-30 22:15:52



@harschware FYI, das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Siehe Tutorial von Oracle .
Basil Bourque

1
Ich empfehle, dass Sie nicht verwenden und Dateim Jahr 2019. Diese Klasse ist schlecht gestaltet und längst veraltet. Verwenden Sie stattdessen Instantoder eine andere Klasse aus java.time, der modernen Java-API für Datum und Uhrzeit .
Ole VV

Antworten:


756

Konvertieren Sie ein Datum mit der folgenden Methode in einen StringDateFormat#format :

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Von http://www.kodejava.org/examples/86.html


25
Warum Calendaranstelle von einfach verwenden new Date()? Gibt es einen Unterschied?
Alexander Malakhov

10
Achtung: SimpleDateFormat ist nicht threadsicher. stackoverflow.com/questions/6840803/…
Zags

23
Kalender ist eine abstrakte Klasse, Datum ist konkret. Date hat keine Ahnung von TimeZone, Locale oder all den guten Sachen, die wir alle nie benutzen.
Nckbrz

30
Das MM/dd/yyyyFormat ist dumm und kaputt. Benutze es nicht. Verwenden Sie immer dd/MM/yyyyoder yyyy-MM-dd.
SystemParadox

13
@ SystemParadox - Es ist dumm, aber das macht es nicht sinnlos. Ich wurde speziell gebeten, es zu verwenden, weil es den Erwartungen der Leute an Berichte entspricht. (Ich würde es yyyy-MM-ddüberall vorziehen , aber was können Sie tun?).
Herbst Leonard

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

Commons-lang DateFormatUtils ist voller Goodies (wenn Sie commons-lang in Ihrem Klassenpfad haben)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

Erfordert eine zusätzliche nullPrüfung.
Farrukh Chishti

23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

Der moderne Weg ist mit den java.time-Klassen, die jetzt die problematischen alten Legacy-Datums- / Uhrzeitklassen ersetzen.

Konvertieren Sie zuerst Ihre java.util.Datein eine Instant. Die InstantKlasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).

Konvertierungen in / von java.time werden mit neuen Methoden durchgeführt, die den alten Klassen hinzugefügt wurden.

Instant instant = myUtilDate.toInstant();

Sowohl Sie java.util.Dateals auch java.time.Instantsind in UTC . Wenn Sie Datum und Uhrzeit als UTC anzeigen möchten, sollten Sie dies auch tun. Rufen Sie toStringauf, um einen String im Standardformat ISO 8601 zu generieren .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Für andere Formate müssen Sie Ihre Instantin die flexibler umwandeln OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Sehen Sie, wie der Code live auf IdeOne.com ausgeführt wird .

Geben Sie a an, um einen String in dem gewünschten Format zu erhalten DateTimeFormatter. Sie können ein benutzerdefiniertes Format angeben. Aber ich würde einen der vordefinierten Formatierer ( ISO_LOCAL_DATE_TIME) verwenden und den Tin seiner Ausgabe durch ein Leerzeichen ersetzen .

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Übrigens empfehle ich diese Art von Format nicht, bei dem Sie absichtlich die UTC-Versatz- oder Zeitzoneninformationen verlieren . Erzeugt Mehrdeutigkeiten hinsichtlich der Bedeutung des Datums- / Uhrzeitwerts dieser Zeichenfolge.

Achten Sie auch auf Datenverlust, da jeder Bruchteil einer Sekunde in der Darstellung des Datums- / Uhrzeitwerts durch Ihren String ignoriert (effektiv abgeschnitten) wird.

Um denselben Moment durch die Linse der Wanduhrzeit einer bestimmten Region zu sehen , wenden Sie a ZoneIdan , um a zu erhalten ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]

Um einen formatierte String zu erzeugen, tun das gleiche wie oben , aber ersetzen odtmit zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Wenn Sie diesen Code sehr oft ausführen, möchten Sie möglicherweise etwas effizienter sein und den Aufruf von vermeiden String::replace. Wenn Sie diesen Anruf abbrechen, wird Ihr Code auch kürzer. Wenn gewünscht, geben Sie Ihr eigenes Formatierungsmuster in Ihrem eigenen DateTimeFormatterObjekt an. Zwischenspeichern Sie diese Instanz als Konstante oder Mitglied zur Wiederverwendung.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Wenden Sie diesen Formatierer an, indem Sie die Instanz übergeben.

String output = zdt.format( f );

Über java.time

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

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

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

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 und 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP (siehe So verwenden ... ).

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.


Hier sind Codebeispiele für die Formatierung mit Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

Dieser Code funktioniert nicht OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Gibt es einen neuen Java 8-Code mit demselben Format 2014-11-14T14: 05: 09 + 00: 00? Vielen Dank
Bob Bolden

@ BobBolden Sie sind richtig, Zwird statt +00:00standardmäßig verwendet. Ich habe die Antwort korrigiert, danke. Zu Ihrer Information, diese bedeuten dasselbe: Zausgesprochen „Zulu“ bedeutet einen Versatz von null Stunden-Minuten-Sekunden, genau wie +00:00. Der ISO 8601- Standard unterstützt beide Stile.
Basil Bourque

@BasilBourque sorry, das ist unklar. Ich habe Java 8 und es gibt überhaupt kein instant.atOffset (). Könnten Sie bitte raten, welcher Code für Java 8 korrekt sein sollte, um genau dasselbe Format zu haben? 2014-11-14T14: 05: 09 + 00: 00 ohne instant.atOffset ()? Ich bin ein bisschen verloren :(
Bob Bolden

@ BobBolden In Java 8 gibt es tatsächlich eine atOffsetMethode für die InstantKlasse. Siehe Javadoc : Instant::atOffset. In Java 8 wird ein Aufruf wie Instant.now().atOffset( ZoneOffset.UTC ).toString()ausgeführt. Überprüfen Sie Ihre importAussagen. Stellen Sie sicher, dass Ihre IDE / Ihr Projekt so eingestellt ist, dass Java 8 oder höher anstelle einer früheren Version von Java ausgeführt wird. Sehen Sie den Code live unter IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

Altenative Einzeiler in einfachem altem Java:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Dies verwendet Formatter und relativen Indexierungs anstelle von SimpleDateFormatdem nicht-sicheren fädeln , btw.

Etwas repetitiver, braucht aber nur eine Aussage. Dies kann in einigen Fällen nützlich sein.


1
Das ist (in) Genie. Viel bessere Leistung für eingeschränkte Umgebungen
Ruslan

9

Warum benutzt du nicht Joda (org.joda.time.DateTime)? Es ist im Grunde ein Einzeiler.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

Ich empfehle, auch eine DateTimeZone zu übergeben, anstatt dem DateTimeObjekt die aktuelle Standardzeitzone der JVM zuzuweisen . new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

Es sieht so aus, als ob Sie nach SimpleDateFormat suchen .

Format: JJJJ-MM-TT KK: MM: SS


Macht das "kk" etwas Besonderes? Ich denke, Eric will es in 24 Stunden.
Charlie Salts

2
Ja, die Stunde am Tag (1-24), aber dies ist wahrscheinlich nicht das, was das OP benötigt. HH(0-23) ist häufiger.
BalusC

1
@Cahrlie Salts kk geht von 1-24, wo HH von 0-23 geht, und es war wahrscheinlich ein bisschen anmaßend von mir anzunehmen, dass er 1-24 wollte @BalusC Das DateFormat-Objekt analysiert und formatiert.
pickypg

Ich verstehe die Relevanz Ihres letzten Kommentars nicht. Mein Kommentar war an Charlie.
BalusC

Ich bin an .NET-Formate gewöhnt, bei denen HH 24-mal und hh am / pm ist. Daher das Kopfkratzen.
Charlie Salts

5

In Einzelaufnahme;)

Um das Datum zu erhalten

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Um die Zeit zu bekommen

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Datum und Uhrzeit abrufen

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Viel Spaß beim Codieren :)


1
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

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

Der einfachste Weg, es zu benutzen, ist wie folgt:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

Dabei ist "JJJJ-MM-TT'T'HH: MM: SS" das Format des Lesedatums

Ausgabe: So 14. April 16:11:48 EEST 2013

Anmerkungen: HH vs hh - HH bezieht sich auf das 24-Stunden-Zeitformat - hh bezieht sich auf das 12-Stunden-Zeitformat


Die Frage ist über die entgegengesetzte Umwandlung.
Vadzim

4

Wenn Sie nur die Uhrzeit ab dem Datum benötigen, können Sie einfach die Funktion von String verwenden.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Dadurch wird der Zeitteil des Strings automatisch gekürzt und im gespeichert timeString.


Dies kann mit einem anderen Gebietsschema brechen.
Vadzim

4

Hier sind Beispiele für die Verwendung der neuen Java 8 Time API zum Formatieren von Legacy java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

Es ist schön, DateTimeFormatterdass es effizient zwischengespeichert werden kann, da es threadsicher ist (im Gegensatz zuSimpleDateFormat ).

Liste der vordefinierten Filter und Referenz der Musternotation .

Credits:

Wie analysiere / formatiere ich Daten mit LocalDateTime? (Java 8)

Java8 java.util.Date Konvertierung in java.time.ZonedDateTime

Sofort zu String formatieren

Was ist der Unterschied zwischen Java 8 ZonedDateTime und OffsetDateTime?


2

Versuche dies,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Ausgabe:

2013-05-14 17:07:21

Weitere Informationen zur Formatierung von Datum und Uhrzeit in Java finden Sie unter den folgenden Links

Oracle-Hilfe

Beispiel für Datum und Uhrzeit in Java


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

Lass uns das versuchen

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Oder eine Utility-Funktion

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Vom Konvertierungsdatum in einen String in Java


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String

1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

Einzeilige Option

Mit dieser Option können Sie das aktuelle Datum einfach einzeilig schreiben.

Bitte beachten Sie, dass dies Calendar.classund verwendet SimpleDateFormatund es dann nicht logisch ist, es unter Java8 zu verwenden.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

1
Zu Ihrer Information, die furchtbar mühsam 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 und höher. Siehe Tutorial von Oracle .
Basil Bourque

1
(1) Die Antwort ist falsch (ich habe gerade 2019-20-23 09:20:22- Monat 20 ??) (2) Ich kann nicht sehen, dass die Antwort etwas enthält, das nicht bereits in anderen Antworten behandelt wird. (3) 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.
Ole VV

Ja ... ich habe einen Fehler gemacht und vergessen, ihn zu korrigieren. Ich fügte es schnell hinzu und erinnerte mich nicht .. sorry !! und danke für eure Kommentare Jungs
Alejandro Teixeira Muñoz

@ OleV.V. Nicht jeder hat Zugriff auf die modernen Java-Daten und die Zeit-API ...... also ... Diese Antwort ist auch gültig ...
Alejandro Teixeira Muñoz

1
Vielen Dank für Ihren Kommentar. Wenn Sie eine Antwort für Java 5 oder für Java 6 und 7 ohne externe Abhängigkeit geben möchten, sehr gut, ist dies willkommen. Bitte machen Sie nur deutlich, dass Sie dies tun. Und Ihre Antwort ist immer noch falsch, Sie werden um Neujahr Überraschungen bekommen.
Ole VV
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.