Java-Zeitstempel - Wie kann ich einen Zeitstempel mit dem Datum 23/09/2007 erstellen?

100

Wie kann ich einen Zeitstempel mit dem Datum 23/09/2007 erstellen?

Pigouina
quelle

Antworten:

154

Mit Timestamp, ich nehme an, du meinst java.sql.Timestamp. Sie werden feststellen, dass diese Klasse einen Konstruktor hat, der ein longArgument akzeptiert . Sie können dies mit der DateFormatKlasse analysieren :

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
Adam Paynter
quelle
1
Das normale ISO-Datumsformat ist JJJJ-MM-TT, sonst großartig!
Vidstige
1
neuer Zeitstempel (Zeit); Fehler geben, dass kein Konstruktor wie dieser, der einen langen Wert annimmt :(
Bhanu Sharma
1
@Bhanu Die Dokumente zeigen, dass dies einen langen Wert hat und korrekt zu funktionieren scheint: docs.oracle.com/javase/7/docs/api/java/sql/…
Hazok
Zu Ihrer Information, die furchtbar lästig 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 und höher. Siehe Tutorial von Oracle .
Basil Bourque
121

Was ist damit?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Pigouina
quelle
1
Timestamp timestamp = Timestamp.valueOf ("2007-09-23 10: 10: 10.0"); zeigt, dass die valueOf-Methode für den Typ Timestamp in jDK 7
Ashish Ratan
neuer Zeitstempel (Zeit); Geben Fehler, dass kein Konstruktor wie dieser, der einen String-Wert annehmen :(
Bhanu Sharma
@Bhanu Der Konstruktor benötigt die Unix-Zeit in Millisekunden. Verwenden Sie die statische Methode valueOf, wenn Sie einen Zeitstempel aus einer Zeichenfolge abrufen möchten.
Hazok
4
Dies scheint die beste Antwort auf die Frage zu sein.
Hazok
1
Die beste Antwort ist, dass Datum, das veraltet ist, eine schlechte Praxis ist, es zu verwenden. Diese Antwort ist besser. Vielen Dank
Alberici
18

Was meinst du mit Zeitstempel? Wenn Sie Millisekunden seit der Unix-Epoche meinen:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

Wenn Sie ein aktuelles java.sql.Timestamp-Objekt möchten:

Timestamp ts = new Timestamp(millis);
Matthew Flaschen
quelle
2
FALSCH und wird nicht kompiliert! Kompilierungsfehler: 09 ist eine Oktalzahl, 9 liegt jedoch außerhalb des Bereichs für Oktale. Logikfehler: Der Monat ist 0-basiert, Sie erhalten 23.
Oktober
Ich kann keinen logischen Fehler erhalten, wenn er nicht kompiliert wird. :) Im Ernst, gute Fänge, Carlos. Das Oktal habe ich vorher gefangen, aber trotzdem falsch eingefügt. :(
Matthew Flaschen
Tatsächlich ist der Timestamp-Konstruktor nicht verfügbar, stattdessen können Sie die Timestamp.valueOf () -Methode verwenden
Shiva Komuravelly
@ShivaKomuravelly nicht alle Zeitstempel-Konstruktoren sind veraltet und zumindest nicht, was Millisekunden dauert, Konstruktor, der Datum als Argument nimmt, ist veraltet
kein Name
Und dafür gibt es eine Konstante (anstelle von Monat = 9):Calendar.SEPTEMBER
Guillaume Husta
11

tl; dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .atStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

Aktualisieren wir diese Seite, indem wir Code mit dem in Java 8 und höher integrierten java.time- Framework anzeigen .

Diese neuen Klassen sind von Joda-Time inspiriert , definiert durch JSR 310 und erweitert durch das ThreeTen-Extra- Projekt. Sie ersetzen die notorisch lästigen alten Datums- und Uhrzeitklassen, die mit frühen Java-Versionen gebündelt sind.

In java.time Instantist ein Moment auf der Timeline in UTC. A ZonedDateTimeist ein Moment, der in eine Zeitzone ( ZoneId) eingestellt ist.

Die Zeitzone ist hier entscheidend. Ein Datum von September 23, 2007kann nicht in einen Moment auf der Zeitachse übersetzt werden, ohne eine Zeitzone anzuwenden. Bedenken Sie, dass in Paris früher ein neuer Tag beginnt als in Montréal, wo es noch „gestern“ ist.

Außerdem repräsentiert ein java.sql.Timestamp sowohl ein Datum als auch eine Uhrzeit. Wir müssen also eine Tageszeit angeben, die dem Datum entspricht. Wir gehen davon aus, dass Sie den ersten Moment des Tages als Tageszeit wünschen. Beachten Sie, dass dies 00:00:00.0aufgrund der Sommerzeit und möglicherweise anderer Anomalien nicht immer die richtige Zeit ist.

Beachten Sie, dass die java.time-Typen im Gegensatz zur alten Klasse java.util.Date und im Gegensatz zu Joda-Time eine Auflösung von Nanosekunden anstelle von Millisekunden haben. Dies entspricht der Auflösung von java.sql.Timestamp.

Beachten Sie, dass der java.sql.Timestamp die unangenehme Angewohnheit hat, die aktuelle Standardzeitzone Ihrer JVM implizit auf ihren Datums- / Uhrzeitwert anzuwenden, wenn eine Zeichenfolgendarstellung über ihre toStringMethode generiert wird. Hier sehen Sie meine America/Los_AngelesZeitzone angewendet. Im Gegensatz dazu sind die java.time-Klassen mit den Standardformaten ISO 8601 vernünftiger .

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;

Dump zur Konsole.

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );

Beim Ausführen.

d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Amerika / Montreal] = sofort: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0

Ab JDBC 4.2 können Sie übrigens die Typen java.time direkt verwenden. Keine Notwendigkeit für java.sql.Timestamp.

  • PreparedStatement.setObject
  • ResultSet.getObject

Ü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
3
Ich frage mich, wie ich OP oder Mods dazu bringen kann, Ihre Antwort als die richtige zu markieren. Die akzeptierte Antwort ist so veraltet.
sttaq
Sehr schön, bis auf einen Tippfehler. asStartOfDay () sollte atStartOfDay () sein.
Tullochgorum
@Tullochgorum behoben. Vielen Dank. Zu Ihrer Information, bei Stack Overflow können Sie solche Änderungen gerne selbst vornehmen, wenn Sie dazu neigen.
Basil Bourque
5

Sie können auch Folgendes tun:

// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Alex
quelle
2
FALSCH: Versuchen Sie es mit einem System.out.println des Ergebnisses! Sie erhalten so etwas wie: "2009-10-23 15: 26: 56.171" Monat ist 0-basiert, also 9 ist Oktober!
user85421
Ich wusste, dass eine dieser Konstanten auf Null basiert, danke. Beitrag aktualisiert.
Alex
1
Oh, und ich habe 'ungetestet' gesetzt :)
Alex
1

Der Vollständigkeit halber auch eine Lösung mit Joda-Time Version 2.5 und seiner DateTimeKlasse:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
user152468
quelle
1
Gute Antwort, aber Sie haben ein entscheidendes Stück verpasst : die Zeitzone . Wenn Sie eine Zeitzone weglassen, wird die aktuelle Standardzeitzone der JVM auf das DateTimeObjekt angewendet . Das bedeutet, dass Ihre Ergebnisse auf verschiedenen Computern oder in der Konfiguration des Host-Betriebssystems oder der JVM-Einstellungen variieren . Übergeben Sie für vorhersagbare Ergebnisse eine Zeitzone an diesen DateTimeKonstruktor. Wählen Sie den richtigen Zeitzonennamen für Ihre Absicht. Zum Beispiel DateTimeZone.forID( "America/Montreal" )oder DateTimeZone.UTC.
Basil Bourque
Dieser Code könnte kürzer sein. Sie müssen nicht in java.util.Date konvertieren, um Millisekunden seit der Epoche abzurufen und zu übergeben . Fragen Sie das DateTimeObjekt einfach nach seiner Millisekunden seit der Epoche. Ersetzen .toDate().getTime()durch .getMillis().
Basil Bourque
@BasilBourque Abhängig von den Umständen möchten Sie möglicherweise die Zeitzone weglassen, um vorhersehbare Ergebnisse zu erzielen. "In Ihrer aktuellen Zeitzone" kann ein durchaus vernünftiges und vorhersehbares Ergebnis sein. Warum eine Zeitzone fest codieren oder Benutzer bitten, eine Zeitzone manuell festzulegen, wenn auf ihrem Computer bereits eine Zeitzone festgelegt ist? Ich wäre sicherlich ziemlich überrascht, wenn eine Anwendung auf meinem Computer Daten ausgeben würde, die an die Zeitzone Amerika / Montreal angepasst sind.
Dan Carter
@dancarter Das Weglassen der optionalen Zeitzone führt zu Verwirrung. Das Auslassen wirft die Unklarheit auf, (a) ob der Programmierer beabsichtigte, sich auf den impliziten Standard zu verlassen, oder (b) ob der Programmierer Zeitzonenprobleme nicht berücksichtigt hat (wie allzu häufig). Wenn Sie tatsächlich die aktuelle Standardzeitzone der JVM verwenden möchten, sagen Sie dies explizit , DateTimeZone.getDefault()indem Sie das Ergebnis aufrufen und als optionales Argument übergeben. (Übrigens auch für das Locale.getDefault()gleiche Problem über die Mehrdeutigkeit optionaler Argumente.)
Basil Bourque
-1

Eine allgemeinere Antwort wäre der Import java.util.Date. Wenn Sie dann ein timestampgleiches Datum festlegen müssen, setzen Sie es einfach gleich new Date().

CSquid
quelle
weil ** Datum ("Zeichenfolge"); ** ist veraltet
Ashish Ratan