it-swarm.com.de

Wie konvertiere ich TimeStamp in Java?

Wie konvertiere ich 'timeStamp' in date, nachdem ich die Zählung in Java erhalte?

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;
    }
}

Dies ist meine Datenbank: enter image description here

Hier war die Ausgabe 2012-08-07 0, aber die entsprechende Abfrage gibt 3 zurück. Warum bekomme ich 0?

87
Krishna Veni

Erstellen Sie einfach ein neues Date-Objekt mit dem getTime()-Wert des Stempels als Parameter.

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

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
164
Alex Coleman
// 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();
34
VincentLamoute

Gerade:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
10

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 lästige alte Datums-/Uhrzeitklassen, die jetzt älter sind und durch die modernen Java.time 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 TIMESTAMP WITH TIME ZONE Verwenden. Aber für diese Antwort werden wir mit dem arbeiten, was wir haben.

Wenn Ihre Aufzeichnungen Momente mit einer Auflösung von Millisekunden darstellen und Sie alle Aufzeichnungen für einen ganzen Tag benötigen, benötigen wir einen Zeitraum. Wir müssen einen Start-Moment und einen Stopp-Moment haben. Ihre Abfrage enthält nur ein einziges Datum-Uhrzeit-Kriterium, für das ein Paar hätte gelten sollen.

Die Klasse LocalDate repräsentiert einen Datumswert ohne Uhrzeit und ohne Zeitzone.

Eine Zeitzone ist für die Bestimmung eines Datums von entscheidender Bedeutung. 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 noch „gestern“ in Montréal Québec .

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. Es ist besser, Ihre gewünschte/erwartete Zeitzone explizit als Argument anzugeben.

Geben Sie ein richtiger Zeitzonenname im Format continent/region An, z. B. America/Montreal , Africa/Casablanca oder Pacific/Auckland. Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben wie EST oder IST, da diese nicht echte Zeitzonen sind, nicht standardisiert und nicht einmalig (!) .

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. Ohne Angabe wird der aktuelle Standardwert der JVM implizit angewendet. Besser explizit, da die Standardeinstellung jederzeit geändert werden kann zur Laufzeit durch einen beliebigen Code in einem beliebigen Thread einer beliebigen App in der JVM.

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 einstellen, mit einer vernünftigen Nummerierung von 1 bis 12 für Januar bis Dezember.

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 vordefinierten Objekte Month enum, eines für jeden Monat des Jahres. Tipp: Verwenden Sie diese Month -Objekte in der gesamten Codebasis und nicht nur als Ganzzahl, um den Code selbstdokumentierender zu gestalten, gültige Werte sicherzustellen und Typensicherheit bereitzustellen.

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

Mit einem LocalDate in der Hand müssen wir das als nächstes in ein Paar Momente umwandeln, den Beginn und das Ende des Tages. Gehen Sie nicht davon aus, dass der Tag um 00:00:00 Uhr beginnt. Aufgrund von Abweichungen wie der Sommerzeit kann der Tag zu einer anderen Zeit beginnen, z. B. um 01:00:00 Uhr. Lassen Sie Java.time den ersten Moment des Tages bestimmen. Wir übergeben ein ZoneId-Argument an LocalDate::atStartOfDay, Um solche Anomalien nachzuschlagen. Das Ergebnis ist ein ZonedDateTime .

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Im Allgemeinen ist der beste Ansatz zum Definieren einer Zeitspanne der Half-Open-Ansatz, bei dem der Anfang inklusive und das Ende exklusiv ist. Ein Tag beginnt also mit dem ersten Moment und dauert 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 den SQL-Befehl BETWEEN nicht verwenden. Dieser Befehl ist Fully-Closed ([]) (Sowohl Anfang als auch Ende sind inklusive), wobei Half-Open ([)) Gewünscht wird. Wir verwenden zwei Kriterien >= Und <.

Ihre Spalte hat einen schlechten Namen. Vermeiden Sie eines der tausend Wörter, die von verschiedenen Datenbanken reserviert werden. Verwenden wir in diesem Beispiel placed.

In Ihrem Code sollten ? Platzhalter verwendet werden, um unsere Momente anzugeben.

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

Aber wir haben ZonedDateTime Objekte in der Hand, während Ihre Datenbank anscheinend Ganzzahlen speichert, wie oben beschrieben. Wenn Sie had Ihre Spalte richtig definiert hätten, könnten wir die ZonedDateTime -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 Epochen-Bezugsdatum der erste Moment von 1970 in UTC ist. Achten Sie auf möglichen Datenverlust, da die Klasse ZonedDateTime eine Auflösung von Nanosekunden ermöglicht. Sekundenbruchteile werden 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 ganzen Zahlen 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 aus ResultSet abrufen, können Sie sie in Instant -Objekte (immer in UTC) oder in - umwandeln. ZonedDateTime Objekte (mit einer zugewiesenen Zeitzone).

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

About Java.time

Das Java.time Framework ist in Java 8 und höher. Diese Klassen ersetzen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

5
Basil Bourque

Ich habe das schon lange gesucht, stellt sich heraus, dass Eposh Converter es einfach 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));
5
Joker 00

Zunächst nutzen Sie den Vorteil der Verwendung einer PreparedStatement nicht. Ich würde zunächst vorschlagen, dass Sie Ihre PreparedStatement wie folgt ändern:

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

Sie können dann statement.setXX(param_index, param_value) verwenden, um die entsprechenden Werte festzulegen. Sehen Sie sich zur Konvertierung in timestamp die folgenden Javadocs an:

PreparedStatement.setTimeStamp ()
Zeitstempel

Hoffe das hilft!

4
Sujay
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   Java.util.Date dateformat = new Java.util.Date(tsp.getTime());
3
MR AND

Sie sind sich nicht sicher, was Sie in der Abfrage auswählen möchten. Denken Sie jedoch daran, dass UNIX_TIMESTAMP() ohne Argumente jetzt die Zeit zurückgibt. Sie sollten wahrscheinlich eine gültige Zeit als Argument angeben oder die Bedingung ändern. 

EDIT: 

Hier ist ein Beispiel für eine zeitgebundene Abfrage, die auf der Frage basiert: 

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()));

EDIT: Zeitstempelspalte

Bei Zeitstempel verwenden Sie Java.sql.Timestamp und 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);
3
tenorsax

In Android ist es sehr einfach. Verwenden Sie einfach die Calendar-Klasse, um currentTimeMillis zu erhalten.

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 

3
Ashish Saini

new Date(timestamp.getTime()) sollte funktionieren, aber die neue, ausgefallene Java 8-Methode (die möglicherweise eleganter und typsicherer ist und die Verwendung der neuen Zeitklassen erleichtert) ist der Aufruf von Date.from(timestamp.toInstant()).

(Verlassen Sie sich nicht auf die Tatsache, dass Timestamp selbst eine Instanz von Date ist; siehe Erläuterung in den Kommentaren von einer anderen Antwort .)

3
Garret Wilson

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 Zeitstempel-zu-Datum-Konvertierung korrekt vorzunehmen, wenn der Zeitstempel und die JVM unterschiedliche Zeitzonen verwenden, können Sie LocalDateTime (oder LocalDateTime in Java8) von Joda Time folgendermaßen 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 toDate-Anweisung.

2

versuchen Sie diesen Java-Code zu verwenden:

enter code here 

  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);
0
Help developer

Angenommen, Sie haben bereits einen Java.util.Date date

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

Mit dieser Methode können Sie das Datum aus dem Zeitstempel und der Zeitzone eines bestimmten Gebiets 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();
}
0
Manoj Patidar