Wie konvertiere ich TimeStamp in Java in Date?

105

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: Geben Sie hier die Bildbeschreibung ein

Hier war die Ausgabe, die ich erhielt, 07.08.2012 0, aber die entsprechende Abfrage gibt 3 zurück. Warum erhalte ich 0?

Krishna Veni
quelle
Duplikat von stackoverflow.com/questions/2318719/…
Rosdi Kasim
Können Sie uns Beispiele zeigen, wie die Tabellendaten aussehen?
Oldrinb
Datum (1344255451,1344255537,1344312502) und Status haben (Q, Q, Q)
Krishna Veni
Der Titel dieser Frage ist ein roter Hering . Das eigentliche Problem ist die unsachgemäße Verwendung von a PreparedStatementmit 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 die setMethoden auf, um Werte an das PreparedStatement zu übergeben. Siehe das richtige Antwort von Sujay und Antwort von Tenorsax .
Basil Bourque

Antworten:

188

Machen Sie einfach ein neues DateObjekt mit den StempelngetTime() Wert als Parameter.

Hier ist ein Beispiel (ich verwende einen Beispielzeitstempel der aktuellen Zeit):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
Alex Coleman
quelle
@ vs06 Warum denkst du, dass es veraltet ist? Die neuesten Java 7- und 8-Dokumente sagen beide etwas anderes ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () und docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman
4
Dies führt zu einem falschen Ergebnis, wenn die Zeitstempel-Zeitzone und die JVM-Zeitzone unterschiedlich sind.
Robert Mugattarov
Wie kann man das zum Beispiel bis zum 14.03.2014 formatieren?
Shurrok
5
Ich hasse es, wenn Leute Bibliotheken in ihren Antworten verwenden und erwarten, dass jeder weiß, wie man sie importiert: /
Sodj
38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();
Vincent Lamoute
quelle
Warum hast du es mit 1000 multipliziert?
Sharpless512
3
Weil die Initialisierung des Datums in Millisekunden und der Zeitstempel in Sekunden erfolgt! Gleiches gilt für alle anderen Konvertierungen! Das ist gut ?
Vincent Lamoute
10

Gerade:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
Alberto Cerqueira
quelle
7

Ich habe seit langer Zeit danach gesucht, es stellt sich heraus, dass der Eposh-Konverter es leicht macht:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

Oder das Gegenteil:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));
Joker 00
quelle
6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

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 LocalDateKlasse 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 Beispiel America/Montreal, Africa/Casablancaoder Pacific/Auckland. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben, wie ESToder, ISTda es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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 .

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

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.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Oder verwenden Sie besser die Monthvordefinierten Enum-Objekte, eines für jeden Monat des Jahres. Tipp: Verwenden Sie diese MonthObjekte in Ihrer gesamten Codebasis und nicht nur als Ganzzahl, um Ihren Code selbstdokumentierender zu gestalten, gültige Werte sicherzustellen und Typensicherheit zu gewährleisten .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Mit einer LocalDateHand 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 ein ZoneIdArgument ab, LocalDate::atStartOfDayum solche Anomalien nachzuschlagen. Das Ergebnis ist a ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

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.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

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 placedin diesem Beispiel.

Ihr Code sollte ?Platzhalter verwendet haben , um unsere Momente anzugeben.

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

Wir haben jedoch ZonedDateTimeObjekte in der Hand, während Ihre Datenbank anscheinend Ganzzahlen speichert, wie oben beschrieben. Wenn Sie Ihre Spalte richtig definiert hätten , könnten wir die ZonedDateTimeObjekte 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 ZonedDateTimeKlasse eine Auflösung von Nanosekunden erreichen kann. Jede gebrochene Sekunde wird in den folgenden Zeilen abgeschnitten.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

Jetzt können wir diese Ganzzahlen an unseren oben definierten SQL-Code übergeben.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

Wenn Sie Ihre ganzzahligen Werte von abrufen ResultSet, können Sie sie in InstantObjekte (immer in UTC) oder in ZonedDateTimeObjekte (mit einer zugewiesenen Zeitzone) umwandeln .

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

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

Basil Bourque
quelle
4

Erstens nutzen Sie nicht den Vorteil der Verwendung von a PreparedStatement. Ich würde zuerst vorschlagen, dass Sie Ihre PreparedStatementwie folgt ändern :

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

Mit diesen können Sie dann statement.setXX(param_index, param_value)die entsprechenden Werte einstellen. timestampSchauen Sie sich zur Konvertierung die folgenden Javadocs an:

PreparedStatement.setTimeStamp ()
Zeitstempel

Hoffe das hilft!

Sujay
quelle
4

In Android ist es sehr einfach. Verwenden Sie einfach die Calender-Klasse, um currentTimeMillis abzurufen.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

Verwenden Sie in Java einfach System.currentTimeMillis (), um den aktuellen Zeitstempel abzurufen

Ashish Saini
quelle
3

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:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

BEARBEITEN: Zeitstempelspalte

Bei Verwendung eines Zeitstempels java.sql.Timestampund von PreparedStatement.setTimestamp () , dh:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);
Tenorsax
quelle
Jetzt ist meine Bedingung * aus xcart_orders auswählen, wobei status = 'Q' AND date = CURDATE (). Jetzt wird auch nur Null angezeigt
Krishna Veni
@krishnaveni Welche Datensätze versuchst du auszuwählen?
Tenorsax
Datum (11111111,123456767,122333344) und Status = (Q, Q, Q) .. alle werden in meiner Datenbank gespeichert. Jetzt möchte ich die Abfrage überprüfen und den Zählwert erhalten und auf meiner Konsole anzeigen (dh wie viele) Daten werden nach Rückgabe des Zählwerts abgeglichen
Krishna Veni
@krishnaveni Wenn Sie möchten, dass die Ergebnismenge an ein bestimmtes Datum gebunden wird, verwenden Sie dieses Datum in der Abfrage, andernfalls entfernen Sie die Datumsbedingung.
Tenorsax
in meinem Code funktioniert erfolgreich, wenn das Datum im Format JJJJ-MM-TT in meiner Datenbank gespeichert ist. Aber jetzt wird mein Datum in einem Zeitstempel in diesem 1343469690-Format gespeichert. Wie bekomme ich den Zählwert? Wie habe ich hier einen Code geschrieben
Krishna Veni
3

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 Aufrufen Date.from(timestamp.toInstant()).

(Verlassen Sie sich nicht auf die Tatsache, dass es Timestampsich um eine Instanz von handelt Date; siehe Erklärung in den Kommentaren einer anderen Antwort .)

Garret Wilson
quelle
3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());
HERR UND
quelle
3

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:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

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 toDateAnweisung.

Robert Mugattarov
quelle
2

Versuchen Sie, diesen Java-Code zu verwenden:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);
Helfen Sie dem Entwickler
quelle
0

Angenommen, Sie haben bereits Folgendes java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
Albizia
quelle
0

Mit dieser Methode können Sie das Datum aus dem Zeitstempel und der Zeitzone eines bestimmten Bereichs abrufen.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}
Manoj Patidar
quelle
-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;
user1485365
quelle
-3
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp(); 
José Ángel Becerra Bernáldez
quelle