Wie bekomme ich den aktuellen Zeitstempel im String-Format in Java? "JJJJ.MM.Td.HH.mm.ss"

174

Wie bekomme ich einen Zeitstempel im String-Format in Java? "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Dies ist, was ich habe, aber Timestamp () erfordert einen Parameter ...

user3388884
quelle
prepareStatement.setTimestamp (1, neuer Zeitstempel (System.currentTimeMillis ()));
Rajat
Welchen Fehler bekommen Sie?
Robert Columbia
Zu Ihrer Information , die furchtbar problematischen alten Datums- / Uhrzeitklassen wie SimpleDateFormatund java.sql.Timestampsind jetzt Legacy , ersetzt durch die in Java 8 und höher integrierten java.time- Klassen. Siehe Tutorial von Oracle .
Basil Bourque

Antworten:

202

Ersetzen

new Timestamp();

mit

new java.util.Date()

weil es keinen Standardkonstruktor für Timestampgibt oder Sie dies mit der Methode tun können:

new Timestamp(System.currentTimeMillis());
Jigar Joshi
quelle
5
Zu Ihrer Information , die furchtbar problematischen alten Datums- / Uhrzeitklassen wie java.util.Dateund java.sql.Timestampsind jetzt Legacy , ersetzt durch die in Java 8 und höher integrierten java.time- Klassen. Siehe Tutorial von Oracle .
Basil Bourque
160

Verwenden Sie java.util.DateKlasse anstelle von Zeitstempel.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Dadurch erhalten Sie das aktuelle Datum in dem angegebenen Format.

dimoniy
quelle
5
Dies hat mir geholfen und ich habe einige Änderungen vorgenommen, damit ich nicht importieren muss new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni
Besser new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
36

tl; dr

Verwenden Sie nur moderne java.time- Klassen. Verwenden Sie niemals die schreckliche Erbe Klassen wie SimpleDateFormat, Dateoder java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Oder verwenden Sie die aktuelle Standardzeitzone der JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time & JDBC 4.2

Der moderne Ansatz verwendet die oben gezeigten Klassen java.time .

Wenn Ihr JDBC-Treiber mit JDBC 4.2 kompatibel ist , können Sie java.time- Objekte direkt mit der Datenbank austauschen . Verwenden Sie PreparedStatement::setObjectund ResultSet::getObject.

Verwenden Sie java.sql nur für Treiber vor JDBC 4.2

Wenn Ihr JDBC-Treiber für die Unterstützung von java.time- Typen noch nicht mit JDBC 4.2 kompatibel ist , müssen Sie auf die Verwendung der java.sql-Klassen zurückgreifen.

Daten speichern.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Daten abrufen.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Die Typen java.sql, z. B. java.sql.Timestamp, sollten nur für die Übertragung in und aus der Datenbank verwendet werden. Konvertieren Sie sofort in java.time-Typen in Java 8 und höher.

java.time.Instant

A java.sql.Timestampabbildet ein java.time.Instant, einen Moment auf der Timeline in UTC. Beachten Sie die neue Konvertierungsmethode toInstant, die der alten Klasse hinzugefügt wurde.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Zeitzone

Wenden Sie die gewünschte / erwartete Zeitzone ( ZoneId) an, um a zu erhalten ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Formatierte Zeichenfolgen

Verwenden Sie a DateTimeFormatter, um Ihre Zeichenfolge zu generieren. Die Mustercodes ähneln denen von, sind java.text.SimpleDateFormatjedoch nicht genau. Lesen Sie das Dokument daher sorgfältig durch.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Dieses spezielle Format ist hinsichtlich seiner genauen Bedeutung nicht eindeutig, da es keinen Hinweis auf einen Versatz von UTC oder Zeitzone gibt.

ISO 8601

Wenn Sie in dieser Angelegenheit mitreden können, empfehlen wir Ihnen, Standardformate nach ISO 8601 zu verwenden, anstatt Ihre eigenen zu rollen. Das Standardformat ist Ihrem sehr ähnlich. Zum Beispiel :
2016-02-20T03:26:32+05:30.

Die java.time-Klassen verwenden standardmäßig diese Standardformate, sodass kein Muster angegeben werden muss. Die ZonedDateTimeKlasse erweitert das Standardformat durch Anhängen des Namens der Zeitzone (eine sinnvolle Verbesserung).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

In java.sql konvertieren

Sie können von java.time zurück nach konvertieren java.sql.Timestamp. Extrahieren Sie eine Instantaus dem ZonedDateTime.

Den alten Klassen wurden neue Methoden hinzugefügt, um die Konvertierung in / von java.time-Klassen zu erleichtern.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabelle der Datums- und Uhrzeittypen in Java (sowohl Legacy als auch Modern) und in Standard-SQL


Ü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 Zeichenfolgen, 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 .

Basil Bourque
quelle
Was ist also der richtige Weg, um den aktuellen Zeitstempel für die Wanduhr im Format "JJJJ.MM.Td.HH.mm.ss" zu erhalten? Ohne explizit die fest codierte Zeichenfolge meiner lokalen Zeitzone anzugeben? Das war es, was der Starter des Themas fragte, und ich konnte es in Ihrer Antwort nicht finden ...
t7ko
@ t7ko Ich habe dem Abschnitt tl; dr eine Zeile mit Beispielcode hinzugefügt, die zeigt, wie explizit nach der aktuellen Standardzeitzone der JVM gefragt wird. Das Aufrufen von "now ()" ohne Argumente bewirkt dasselbe, ist jedoch nicht klar, ob Sie die Standardeinstellung verwenden wollten oder ob Sie das entscheidende Problem der Zeitzone ignoriert oder vergessen haben.
Basil Bourque
32

Sie können java.util.Date anstelle von Timestamp verwenden:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
quelle
6

Ein geeigneterer Ansatz besteht darin, eine Gebietsschema-Region als Parameter im Konstruktor anzugeben. Im folgenden Beispiel wird eine Region mit US-Gebietsschema verwendet. Die Datumsformatierung ist vom Gebietsschema abhängig und verwendet das Gebietsschema, um Informationen in Bezug auf die Gepflogenheiten und Konventionen der Region des Benutzers anzupassen. Gebietsschema (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
user3144836
quelle
1
Keine "Gebietsschema-Zone". Ich vermute, Sie sind verwirrend Localeund Zeitzone, die nichts miteinander zu tun haben. Localesteuert die kulturellen Normen für die Formatierung und die menschliche Sprache, die für den Namen des Monats / Tages verwendet wird. Die Zeitzone stellt das Datum-Zeit - Darstellung , um einige Region angemessen zu sein Wandtaktzeit . Im Fall dieser Frage ist das Gebietsschema irrelevant, da es keine Formatierungsprobleme gibt, mit denen kulturelle Normen angewendet werden können, und es gibt keine Namen für Monat / Tag, die für eine bestimmte menschliche Sprache lokalisiert werden könnten.
Basil Bourque
@BasilBourque Vielen Dank für Ihre Eingabe. Ich habe die Antwort aktualisiert, um expliziter zu sein
user3144836
4

Sie können Folgendes verwenden

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Hoffe das wird helfen. Nur mein Vorschlag und nicht für Belohnungspunkte.

Phönix
quelle
Es hat nicht das gewünschte Zeichenfolgenformat. Ich befürchte auch, dass das einzige, was zu ein paar ähnlichen Antworten beiträgt, unnötige Komplikationen sind…
Ole VV
4

Verwenden Sie moderne java.timeKlassen, wenn Sie Java 8 oder höher verwenden.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Basil Bourques Antwort ist ziemlich gut. Aber es ist zu lang. Viele Menschen hätten keine Geduld, es zu lesen. Die Top 3 Antworten sind zu alt und können Java New Bee irreführen. Deshalb biete ich diese kurze und moderne Antwort für neue Entwickler. Hoffe, diese Antwort kann die Verwendung von schrecklichen reduzieren SimpleDateFormat.

gzc
quelle