Wie konvertiere ich 'timeStamp' in date
nachdem ich die Anzahl in Java erhalten habe?
Mein aktueller Code lautet wie folgt:
public class GetCurrentDateTime {
public int data() {
int count = 0;
java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
java.sql.Date date = new java.sql.Date(timeStamp.getTime());
System.out.println(date);
//count++;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");
PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
ResultSet result = statement.executeQuery();
while (result.next()) {
// Do something with the row returned.
count++; //if the first col is a count.
}
} catch (Exception exc) {
System.out.println(exc.getMessage());
}
return count;
}
}
Das ist meine Datenbank:
Hier war die Ausgabe, die ich erhielt, 07.08.2012 0, aber die entsprechende Abfrage gibt 3 zurück. Warum erhalte ich 0?
PreparedStatement
mit falscher Syntax. Sie können keine Java-Variablen in den Text Ihrer SQL-Zeichenfolge einbetten. Betten Sie stattdessen?
in die SQL-Zeichenfolge ein und rufen Sie dieset
Methoden auf, um Werte an das PreparedStatement zu übergeben. Siehe das richtige Antwort von Sujay und Antwort von Tenorsax .Antworten:
Machen Sie einfach ein neues
Date
Objekt mit den StempelngetTime()
Wert als Parameter.Hier ist ein Beispiel (ich verwende einen Beispielzeitstempel der aktuellen Zeit):
quelle
quelle
Gerade:
quelle
Ich habe seit langer Zeit danach gesucht, es stellt sich heraus, dass der Eposh-Konverter es leicht macht:
Oder das Gegenteil:
quelle
tl; dr
…
…
…
java.time
Sie verwenden problematische alte Datums- / Uhrzeitklassen , die jetzt älter sind und durch die moderne java.time ersetzt werden Klassen ersetzt werden.
Anscheinend speichern Sie einen Moment in Ihrer Datenbank in einer Spalte eines ganzzahligen Typs. Das ist bedauerlich. Sie sollten stattdessen eine Spalte eines Typs wie den SQL-Standard verwenden
TIMESTAMP WITH TIME ZONE
. Aber für diese Antwort werden wir mit dem arbeiten, was wir haben.Wenn Ihre Datensätze Momente mit einer Auflösung von Millisekunden darstellen und Sie alle Datensätze für einen ganzen Tag benötigen, benötigen wir einen Zeitbereich. Wir müssen einen Start- und einen Stoppmoment haben. Ihre Abfrage hat nur ein einziges Datum-Uhrzeit-Kriterium, bei dem sie ein Paar haben sollte.
Die
LocalDate
Klasse repräsentiert einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone.Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden Moment variiert das Datum weltweit je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während es in Montréal Québec noch „gestern“ ist .
Wenn keine Zeitzone angegeben ist, wendet die JVM implizit ihre aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit ändern, sodass Ihre Ergebnisse variieren können. Geben Sie Ihre gewünschte / erwartete Zeitzone besser explizit als Argument an.
Geben Sie einen richtigen Zeitzonennamen im Format
continent/region
, wie zum BeispielAmerica/Montreal
,Africa/Casablanca
oderPacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben, wieEST
oder,IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.Wenn Sie die aktuelle Standardzeitzone der JVM verwenden möchten, fragen Sie danach und übergeben Sie sie als Argument. Wenn nicht angegeben, wird der aktuelle Standard der JVM implizit angewendet. Es ist besser, explizit zu sein, da die Standardeinstellung jederzeit zur Laufzeit durch einen beliebigen Code in einem beliebigen Thread einer App innerhalb der JVM geändert werden kann .
Oder geben Sie ein Datum an. Sie können den Monat durch eine Zahl mit der vernünftigen Nummer 1-12 für Januar bis Dezember einstellen.
Oder verwenden Sie besser die
Month
vordefinierten Enum-Objekte, eines für jeden Monat des Jahres. Tipp: Verwenden Sie dieseMonth
Objekte in Ihrer gesamten Codebasis und nicht nur als Ganzzahl, um Ihren Code selbstdokumentierender zu gestalten, gültige Werte sicherzustellen und Typensicherheit zu gewährleisten .Mit einer
LocalDate
Hand müssen wir das als nächstes in ein Paar Momente verwandeln, den Start und Stopp des Tages. Gehen Sie nicht davon aus, dass der Tag um 00:00:00 Uhr beginnt. Aufgrund von Anomalien wie der Sommerzeit (DST) kann der Tag zu einer anderen Zeit wie 01:00:00 Uhr beginnen. Lassen Sie also java.time den ersten Moment des Tages bestimmen. Wir geben einZoneId
Argument ab,LocalDate::atStartOfDay
um solche Anomalien nachzuschlagen. Das Ergebnis ist aZonedDateTime
.Im Allgemeinen ist der Half-Open-Ansatz der beste Ansatz zur Definition einer Zeitspanne, bei dem der Anfang inklusive und das Ende exklusiv ist . Ein Tag beginnt also mit seinem ersten Moment und läuft bis zum ersten Moment des nächsten Tages, schließt ihn jedoch nicht ein.
Unsere Abfrage für einen ganzen Tag kann keinen SQL-Befehl verwenden
BETWEEN
. Dieser Befehl ist Fully-Closed ([]
) (Anfang und Ende sind inklusive), wo wir Half-Open ([)
) wollen. Wir verwenden zwei Kriterien>=
und<
.Ihre Spalte ist schlecht benannt. Vermeiden Sie die tausend Wörter, die von verschiedenen Datenbanken reserviert wurden. Verwenden wir
placed
in diesem Beispiel.Ihr Code sollte
?
Platzhalter verwendet haben , um unsere Momente anzugeben.Wir haben jedoch
ZonedDateTime
Objekte in der Hand, während Ihre Datenbank anscheinend Ganzzahlen speichert, wie oben beschrieben. Wenn Sie Ihre Spalte richtig definiert hätten , könnten wir dieZonedDateTime
Objekte einfach mit jedem JDBC-Treiber übergeben, der JDBC 4.2 oder höher unterstützt.Stattdessen müssen wir in ganzen Sekunden eine Zählung aus der Epoche erhalten. Ich gehe davon aus, dass Ihr Epochenreferenzdatum der erste Moment von 1970 in UTC ist. Achten Sie auf mögliche Datenverluste, da die
ZonedDateTime
Klasse eine Auflösung von Nanosekunden erreichen kann. Jede gebrochene Sekunde wird in den folgenden Zeilen abgeschnitten.Jetzt können wir diese Ganzzahlen an unseren oben definierten SQL-Code übergeben.
Wenn Sie Ihre ganzzahligen Werte von abrufen
ResultSet
, können Sie sie inInstant
Objekte (immer in UTC) oder inZonedDateTime
Objekte (mit einer zugewiesenen Zeitzone) umwandeln .Ü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 auf java.time Klassen .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
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 .quelle
Erstens nutzen Sie nicht den Vorteil der Verwendung von a
PreparedStatement
. Ich würde zuerst vorschlagen, dass Sie IhrePreparedStatement
wie folgt ändern :Mit diesen können Sie dann
statement.setXX(param_index, param_value)
die entsprechenden Werte einstellen.timestamp
Schauen Sie sich zur Konvertierung die folgenden Javadocs an:PreparedStatement.setTimeStamp ()
Zeitstempel
Hoffe das hilft!
quelle
In Android ist es sehr einfach. Verwenden Sie einfach die Calender-Klasse, um currentTimeMillis abzurufen.
Verwenden Sie in Java einfach System.currentTimeMillis (), um den aktuellen Zeitstempel abzurufen
quelle
Sie sind sich nicht sicher, was Sie in der Abfrage auswählen möchten, aber denken Sie daran, dass
UNIX_TIMESTAMP()
ohne Argumente die Zeit jetzt zurückgegeben wird. Sie sollten wahrscheinlich eine gültige Zeit als Argument angeben oder die Bedingung ändern.BEARBEITEN:
Hier ist ein Beispiel für eine zeitgebundene Abfrage basierend auf der Frage:
BEARBEITEN: Zeitstempelspalte
Bei Verwendung eines Zeitstempels
java.sql.Timestamp
und von PreparedStatement.setTimestamp () , dh:quelle
new Date(timestamp.getTime())
sollte funktionieren, aber der neue ausgefallene Java 8-Weg (der eleganter und typsicherer sein kann und Ihnen hilft, die neuen Zeitklassen zu verwenden) ist das AufrufenDate.from(timestamp.toInstant())
.(Verlassen Sie sich nicht auf die Tatsache, dass es
Timestamp
sich um eine Instanz von handeltDate
; siehe Erklärung in den Kommentaren einer anderen Antwort .)quelle
quelle
Ich fühle mich verpflichtet zu antworten, da andere Antworten zeitzonenunabhängig zu sein scheinen, was sich eine reale Anwendung nicht leisten kann. Um die Konvertierung von Zeitstempel zu Datum korrekt zu machen, wenn der Zeitstempel und die JVM unterschiedliche Zeitzonen verwenden, können Sie LocalDateTime von Joda Time (oder LocalDateTime in Java8) wie folgt verwenden:
Im folgenden Beispiel wird davon ausgegangen, dass der Zeitstempel UTC ist (wie dies normalerweise bei Datenbanken der Fall ist). Wenn sich Ihre Zeitstempel in einer anderen Zeitzone befinden, ändern Sie den Zeitzonenparameter der
toDate
Anweisung.quelle
Versuchen Sie, diesen Java-Code zu verwenden:
quelle
Angenommen, Sie haben bereits Folgendes
java.util.Date date
:quelle
Mit dieser Methode können Sie das Datum aus dem Zeitstempel und der Zeitzone eines bestimmten Bereichs abrufen.
quelle
quelle
quelle