¿Cómo convertir TimeStamp a fecha en Java?

105

¿Cómo convierto 'timeStamp' a datedespués de obtener el recuento en Java?

Mi código actual es el siguiente:

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

Esta es mi base de datos: ingrese la descripción de la imagen aquí

Aquí el resultado que obtuve fue 2012-08-07 0, pero la consulta equivalente devuelve 3. ¿Por qué obtengo 0?

Krishna Veni
fuente
Duplicado de stackoverflow.com/questions/2318719/…
Rosdi Kasim
¿Puede mostrarnos ejemplos de cómo se ven los datos de la tabla?
oldrinb
fecha (1344255451,1344255537,1344312502) y estado tienen (Q, Q, Q)
Krishna Veni
Duplicado de esta pregunta, ¿Cómo convertir de java.sql.Timestamp a java.util.Date? .
Basil Bourque
El título de esta pregunta es una pista falsa . El verdadero problema es el uso inadecuado de a PreparedStatementcon sintaxis incorrecta. No puede incrustar variables de Java en el texto de su cadena SQL. En su lugar, incruste ?en la cadena SQL, luego llame a los setmétodos para pasar valores al PreparedStatement. Vea la respuesta correcta de Sujay y la respuesta de tenorsax .
Basil Bourque

Respuestas:

188

Simplemente cree un nuevo Dateobjeto con el getTime()valor del sello como parámetro.

Aquí hay un ejemplo (yo uso una marca de tiempo de ejemplo de la hora actual):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
Alex Coleman
fuente
@ vs06 ¿Qué te hace pensar que está obsoleto? Los últimos documentos de Java 7 y 8 dicen lo contrario ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () y docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman
4
Esto producirá un resultado incorrecto si la zona horaria de la marca de tiempo y la zona horaria de la JVM son diferentes.
Robert Mugattarov
¿Cómo conseguir esto formateado al 14.03.2014 por ejemplo?
shurrok
6
Odio cuando las personas usan bibliotecas en sus respuestas y espero que todos sepan cómo importarlas: /
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();
VincentLamoute
fuente
¿Por qué lo multiplicaste por 1000?
Sharpless512
3
¡Porque la inicialización de la fecha está en milisegundos y la marca de tiempo está en segundos! ¡Lo mismo piensa para todas las demás conversiones! Es bueno ?
VincentLamoute
10

Sólo:

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

He estado buscando esto desde hace mucho tiempo, resulta que el convertidor Eposh lo hace fácilmente:

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

O al contrario:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));
Joker 00
fuente
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

Está utilizando clases de fecha y hora antiguas problemáticas que ahora son heredadas, suplantadas por el moderno java.time clases .

Aparentemente, está almacenando un momento en su base de datos en una columna de algún tipo entero. Eso es desafortunado. En su lugar, debería utilizar una columna de un tipo como el estándar SQL TIMESTAMP WITH TIME ZONE. Pero, para esta Respuesta, trabajaremos con lo que tenemos.

Si sus registros representan momentos con una resolución de milisegundos y desea todos los registros de un día completo, entonces necesitamos un intervalo de tiempo. Debemos tener un momento de inicio y un momento de parada. Su consulta tiene un solo criterio de fecha y hora donde debería haber tenido un par.

los LocalDate clase representa un valor de solo fecha sin hora del día y sin zona horaria.

Una zona horaria es crucial para determinar una fecha. Para un momento dado, la fecha varía en todo el mundo según la zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es “ayer” en Montreal, Québec .

Si no se especifica ninguna zona horaria, la JVM aplica implícitamente su zona horaria predeterminada actual. Ese valor predeterminado puede cambiar en cualquier momento, por lo que sus resultados pueden variar. Es mejor especificar la zona horaria deseada / esperada explícitamente como argumento.

Especificar un nombre de zona horaria correcta en el formato de continent/region, por ejemplo America/Montreal, Africa/Casablancao Pacific/Auckland. Nunca use el 3-4 abreviatura de letras tales como ESTo IST, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).

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

Si desea utilizar la zona horaria predeterminada actual de la JVM, solicítela y páselo como argumento. Si se omite, el valor predeterminado actual de la JVM se aplica implícitamente. Es mejor ser explícito, ya que el valor predeterminado puede cambiarse en cualquier momento durante el tiempo de ejecución mediante cualquier código en cualquier hilo de cualquier aplicación dentro de la JVM.

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

O especifique una fecha. Puede establecer el mes con un número, con una numeración sensata del 1 al 12 para enero-diciembre.

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, mejor, use los Monthobjetos enum predefinidos, uno para cada mes del año. Consejo: utilice estos Monthobjetos en todo su código base en lugar de un simple número entero para hacer que su código sea más autodocumentado, garantizar valores válidos y proporcionar seguridad de tipos .

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

Con un LocalDateen la mano, lo siguiente que tenemos que hacer es transformar eso en un par de momentos, el comienzo y el final del día. No asuma que el día comienza a las 00:00:00 hora del día. Debido a anomalías como el horario de verano (DST), el día puede comenzar a otra hora, como la 01:00:00. Así que deja que java.time determine el primer momento del día. Pasamos un ZoneIdargumento a LocalDate::atStartOfDaypara buscar tales anomalías. El resultado es a ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Generalmente, el mejor enfoque para definir un lapso de tiempo es el enfoque semiabierto, donde el principio es inclusivo mientras que el final es exclusivo . Entonces, un día comienza con su primer momento y se extiende hasta, pero sin incluir, el primer momento del día siguiente.

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

Nuestra consulta de un día entero no puede hacer uso del comando SQL BETWEEN. Ese comando es Completamente cerrado ( []) (tanto el principio como el final son inclusivos) donde queremos Half-Open ( [)). Usamos un par de criterios >=y< .

Tu columna está mal nombrada. Evite cualquiera de las mil palabras reservadas por diversas bases de datos. Usemos placeden este ejemplo.

Su código debería haber utilizado ?marcadores de posición para especificar nuestros momentos.

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

Pero tenemos ZonedDateTimeobjetos en la mano, mientras que su base de datos aparentemente almacena enteros como se discutió anteriormente. Si hubiera definido su columna correctamente podríamos simplemente pasar los ZonedDateTimeobjetos con cualquier controlador JDBC de soporte de JDBC 4.2 o posterior.

Pero, en cambio, necesitamos obtener un recuento desde la época en segundos completos. Asumiré que la fecha de referencia de su época es el primer momento de 1970 en UTC. Tenga cuidado con la posible pérdida de datos, ya que la ZonedDateTimeclase tiene una resolución de nanosegundos. Cualquier fracción de segundo se truncará en las siguientes líneas.

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

Ahora estamos listos para pasar esos números enteros a nuestro código SQL definido anteriormente.

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

Cuando recupera sus valores enteros del ResultSet, puede transformarlos en Instantobjetos (siempre en UTC) o en ZonedDateTimeobjetos (con una zona horaria asignada).

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

Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time clases .

Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas funciones y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para principios de Android, el ThreeTenABP proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente
4

En primer lugar, no está aprovechando la ventaja de utilizar un PreparedStatement. Primero le sugiero que modifique su PreparedStatementcomo sigue:

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

A continuación, puede utilizar statement.setXX(param_index, param_value)para establecer los valores respectivos. Para la conversión atimestamp , eche un vistazo a los siguientes javadocs:

Marca de tiempo de PreparedStatement.setTimeStamp ()

¡Espero que esto ayude!

Sujay
fuente
4

En Android es muy simple. Simplemente use la clase Calender para obtener currentTimeMillis.

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

En Java, simplemente use System.currentTimeMillis () para obtener la marca de tiempo actual

Ashish Saini
fuente
3

No estoy seguro de lo que está intentando seleccionar en la consulta, pero tenga en cuenta que UNIX_TIMESTAMP()sin argumentos devuelve el tiempo ahora. Probablemente debería proporcionar un tiempo válido como argumento o cambiar la condición.

EDITAR:

Aquí hay un ejemplo de una consulta con límite de tiempo basada en la pregunta:

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

EDITAR: columna de marca de tiempo

En caso de uso de marca de tiempo java.sql.Timestampy PreparedStatement.setTimestamp () , es decir:

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
fuente
ahora mi condición es seleccionar * de xcart_orders donde estado = 'Q' Y fecha = CURDATE (). ahora también se muestra solo cero
Krishna Veni
@krishnaveni ¿Qué registros estás intentando seleccionar?
tenorsax
fecha (11111111,123456767,122333344) y estado = (Q, Q, Q) .. todos están guardados en mi base de datos. Ahora deseo necesitar verificar la consulta y obtener el valor de conteo y mostrar en mi consola (es decir) cuántos los datos coinciden después de devolver el valor de recuento
Krishna Veni
@krishnaveni Si desea que el conjunto de resultados esté vinculado a una fecha determinada, utilice esa fecha en la consulta; de lo contrario, elimine la condición de fecha.
tenorsax
en mi código funciona correctamente cuando la fecha está en formato aaaa-mm-dd guardada en mi base de datos. Pero ahora mi fecha está guardada en una marca de tiempo en este formato 1343469690. ¿Cómo se obtiene el valor de recuento? ¿Cómo escribo un código aquí?
Krishna Veni
3

new Date(timestamp.getTime())debería funcionar, pero la nueva forma elegante de Java 8 (que puede ser más elegante y más segura para los tipos, además de ayudarlo a usar las nuevas clases de tiempo) es llamar Date.from(timestamp.toInstant()).

(No confíe en el hecho de que en Timestampsí mismo es una instancia de Date; vea la explicación en los comentarios de otra respuesta ).

Garret Wilson
fuente
3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());
SEÑOR Y
fuente
3

Me siento obligado a responder, ya que otras respuestas parecen ser independientes de la zona horaria, lo que una aplicación del mundo real no puede permitirse. Para hacer que la conversión de la marca de tiempo a la fecha sea correcta cuando la marca de tiempo y la JVM están usando diferentes zonas horarias, puede usar LocalDateTime de Joda Time (o LocalDateTime en Java8) de esta manera:

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

El siguiente ejemplo asume que la marca de tiempo es UTC (como suele ser el caso de las bases de datos). En caso de que sus marcas de tiempo estén en una zona horaria diferente, cambie el parámetro de zona horaria de la toDatedeclaración.

Robert Mugattarov
fuente
2

intente usar este código 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);
Desarrollador de ayuda
fuente
0

Suponiendo que tiene un preexistente java.util.Date date:

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

Puede utilizar este método para obtener la fecha de la marca de tiempo y la zona horaria de un área en particular.

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
fuente
-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;
usuario1485365
fuente
-3
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp(); 
José Ángel Becerra Bernáldez
fuente