Come convertire TimeStamp in Date in Java?


105

Come posso convertire 'timeStamp' in datedopo aver ottenuto il conteggio in java?

Il mio codice attuale è il seguente:

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

Questo è il mio database: inserisci qui la descrizione dell'immagine

Qui l'output che ho ottenuto è stato 2012-08-07 0, ma la query equivalente restituisce 3. Perché ottengo 0?



Puoi mostrarci esempi di come appaiono i dati della tabella?
oldrinb

data (1344255451,1344255537,1344312502) e lo stato hanno (Q, Q, Q)
Krishna Veni


Il titolo di questa domanda è una falsa pista . Il vero problema è l'uso improprio di un PreparedStatementcon sintassi errata. Non è possibile incorporare variabili Java nel testo della stringa SQL. Incorpora invece ?la stringa SQL, quindi chiama i setmetodi per passare i valori a PreparedStatement. Vedi la risposta corretta di Sujay e la risposta di tenorsax .
Basil Bourque

Risposte:


188

Basta creare un nuovo Dateoggetto con il timbrogetTime() valore come parametro.

Ecco un esempio (utilizzo un timestamp di esempio dell'ora corrente):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 Cosa ti fa pensare che sia deprecato? Gli ultimi documenti java 7 e 8 dicono entrambi diversamente ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () e docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman

4
Ciò produrrà un risultato errato se il fuso orario Timestamp e il fuso orario JVM sono diversi.
Robert Mugattarov

Come ottenerlo formattato al 14.03.2014, ad esempio?
shurrok

6
Odio quando ppl usa le librerie nelle loro risposte e mi aspetto che tutti sappiano come importarle: /
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();

Perché l'hai moltiplicato per 1000?
Sharpless512

3
Perché l'inizializzazione della data è in millisecondi e il timestamp è in secondi! Lo stesso pensa per tutte le altre conversioni! Va bene ?
VincentLamoute

10

Appena:

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

7

Lo stavo cercando da molto tempo, ho scoperto che il convertitore Eposh lo fa facilmente:

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

O il contrario:

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

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

Stai usando vecchie classi data-ora fastidiose che ora sono ereditate, soppiantate dal moderno java.time classi .

Apparentemente stai memorizzando un momento nel tuo database in una colonna di qualche tipo intero. Questo è sfortunato. Dovresti invece usare una colonna di un tipo come lo standard SQLTIMESTAMP WITH TIME ZONE . Ma, per questa risposta, lavoreremo con ciò che abbiamo.

Se i tuoi record rappresentano momenti con una risoluzione di millisecondi e desideri tutti i record per un'intera giornata, è necessario un intervallo di tempo. Dobbiamo avere un momento di inizio e un momento di arresto. La tua query ha un solo criterio data-ora in cui avrebbe dovuto avere una coppia.

Il LocalDate classe rappresenta un valore di sola data senza ora del giorno e senza fuso orario.

Un fuso orario è fondamentale per determinare una data. Per ogni dato momento, la data varia in tutto il mondo in base alla zona. Ad esempio, pochi minuti dopo la mezzanotte a Parigi, la Francia è un nuovo giorno mentre ancora "ieri" a Montréal Québec .

Se non viene specificato alcun fuso orario, la JVM applica implicitamente il proprio fuso orario predefinito corrente. L'impostazione predefinita può cambiare in qualsiasi momento, quindi i risultati potrebbero variare. È meglio specificare esplicitamente il fuso orario desiderato / previsto come argomento.

Specificare un nome proprio fuso orario nel formato continent/region, come ad esempio America/Montreal, Africa/Casablancao Pacific/Auckland. Non usare mai il 3-4 lettera sigla come ad esempio ESTo ISTcome sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).

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

Se desideri utilizzare l'attuale fuso orario predefinito della JVM, richiedilo e passa come argomento. Se omesso, il valore predefinito corrente della JVM viene applicato implicitamente. Meglio essere espliciti, poiché l'impostazione predefinita può essere modificata in qualsiasi momento durante il runtime da qualsiasi codice in qualsiasi thread di qualsiasi app all'interno della JVM.

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

Oppure specifica una data. Puoi impostare il mese con un numero, con una numerazione sana da 1 a 12 per gennaio-dicembre.

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.

O, meglio, usa gli Monthoggetti enum predefiniti, uno per ogni mese dell'anno. Suggerimento: utilizza questi Monthoggetti in tutta la base del codice anziché un semplice numero intero per rendere il codice più auto-documentante, garantire valori validi e fornire l'indipendenza dai tipi .

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

Con un LocalDatein mano, dobbiamo poi trasformarlo in un paio di momenti, l'inizio e la fine della giornata. Non dare per scontato che la giornata inizi alle 00:00:00 ora del giorno. A causa di anomalie come l'ora legale (DST), il giorno può iniziare in un altro momento come l'01: 00:00. Quindi lascia che java.time determini il primo momento della giornata. Passiamo un ZoneIdargomento a LocalDate::atStartOfDayper cercare tali anomalie. Il risultato è un file ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Generalmente l'approccio migliore per definire un arco di tempo è l'approccio Half-Open in cui l'inizio è inclusivo mentre il finale è esclusivo . Quindi un giorno inizia con il suo primo momento e arriva fino al primo momento del giorno successivo, ma non lo include.

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

La nostra query per un'intera giornata non può utilizzare il comando SQL BETWEEN. Quel comando è Fully-Closed ( []) (sia l'inizio che la fine sono inclusi) dove vogliamo Half-Open ( [)). Usiamo un paio di criteri >=e <.

La tua colonna ha un nome sbagliato. Evita le mille parole riservate dai vari database. Usiamo placedin questo esempio.

Il tuo codice avrebbe dovuto utilizzare ?segnaposto in cui specificare i nostri momenti.

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

Ma abbiamo ZonedDateTimeoggetti in mano, mentre il tuo database a quanto pare memorizza numeri interi come discusso sopra. Se avessi definito correttamente la tua colonna, potremmo semplicemente passare gli ZonedDateTimeoggetti con qualsiasi driver JDBC che supporti JDBC 4.2 o successivo.

Ma invece dobbiamo ottenere un conteggio dall'epoca in secondi interi. Presumo che la data di riferimento della tua epoca sia il primo momento del 1970 in UTC. Attenzione alla possibile perdita di dati, poiché la ZonedDateTimeclasse è in grado di risoluzione in nanosecondi. Qualsiasi frazione di secondo verrà troncata nelle righe seguenti.

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

Ora siamo pronti per passare questi numeri interi al nostro codice SQL definito sopra.

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

Quando recuperi i tuoi valori interi da ResultSet, puoi trasformarli in Instantoggetti (sempre in UTC) o in ZonedDateTimeoggetti (con un fuso orario assegnato).

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

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 e versioni successive
    • Built-in.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte delle funzionalità java.time sono portate indietro a Java 6 e 7 in ThreeTen-Backport .
  • androide
    • Versioni successive delle implementazioni di bundle Android delle classi java.time.
    • Per le versioni precedenti di Android, il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP… .

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


4

Prima di tutto, non stai sfruttando il vantaggio di utilizzare un file PreparedStatement. Per prima cosa suggerirei di modificare il tuo PreparedStatementcome segue:

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

È quindi possibile utilizzare statement.setXX(param_index, param_value)per impostare i rispettivi valori. Per la conversione in timestamp, dai un'occhiata ai seguenti javadoc:

PreparedStatement.setTimeStamp ()
Timestamp

Spero che questo ti aiuti!


4

In Android è molto semplice. Usa la classe Calender per ottenere currentTimeMillis.

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

In Java basta usare System.currentTimeMillis () per ottenere il timestamp corrente


3

Non sei sicuro di cosa stai cercando di selezionare nella query, ma tieni presente che UNIX_TIMESTAMP()senza argomenti restituisce l'ora ora. Probabilmente dovresti fornire un'ora valida come argomento o modificare la condizione.

MODIFICARE:

Di seguito è riportato un esempio di una query limitata nel tempo basata sulla domanda:

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: colonna timestamp

In caso di utilizzo del timestamp java.sql.Timestampe PreparedStatement.setTimestamp () , ovvero:

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

ora la mia condizione è selezionata * da xcart_orders dove status = 'Q' AND date = CURDATE (). ora anche visualizzato solo zero
Krishna Veni

@krishnaveni quali record stai cercando di selezionare?
tenorsax

data (11111111,123456767,122333344) e stato = (Q, Q, Q) .. sono tutti salvati nel mio database. ora desidero controllare la query e ottenere il valore di conteggio e visualizzare sulla mia console (cioè) quanti i dati vengono confrontati dopo aver restituito il valore di conteggio
Krishna Veni

@krishnaveni Se vuoi che il gruppo di risultati sia vincolato da una certa data, usa quella data nella query, altrimenti rimuovi la condizione della data.
tenorsax

nel mio codice funziona correttamente quando la data è nel formato aaaa-mm-gg salvata nel mio database. Ma ora la mia data viene salvata in un timestamp in questo formato 1343469690. Come si ottiene il valore di conteggio? Come ho scritto un codice qui
Krishna Veni

3

new Date(timestamp.getTime()) dovrebbe funzionare, ma il nuovo fantastico modo di Java 8 (che potrebbe essere più elegante e più sicuro per i tipi, così come aiutarti a usare le nuove classi di tempo) è chiamare Date.from(timestamp.toInstant()) .

(Non fare affidamento sul fatto che esso Timestampstesso è un'istanza di Date; vedere la spiegazione nei commenti di un'altra risposta .)


3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());

3

Mi sento obbligato a rispondere poiché altre risposte sembrano essere indipendenti dal fuso orario che un'applicazione del mondo reale non può permettersi di essere. Per rendere corretta la conversione timestamp-to-date quando il timestamp e la JVM utilizzano fusi orari diversi, puoi utilizzare LocalDateTime di Joda Time (o LocalDateTime in Java8) in questo modo:

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

L'esempio seguente presuppone che il timestamp sia UTC (come di solito accade con i database). Nel caso in cui i tuoi timestamp siano in un fuso orario diverso, modifica il parametro timezone toDatedell'istruzione.


2

prova a usare questo codice java:

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

Supponendo che tu abbia una preesistente java.util.Date date:

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

0

È possibile utilizzare questo metodo per ottenere la data dal timestamp e dal fuso orario di un'area specifica.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.