¿Cómo convertir TimeStamp a Date en Java?

¿Cómo convierto ‘timeStamp’ a la date después de obtener el conteo 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: enter image description here

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

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

Aquí hay un ejemplo (utilizo 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); 
 // 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(); 

Sólo:

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

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

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

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

PreparedStatement.setTimeStamp ()
Marca de tiempo

¡Espero que esto ayude!

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

EDITAR:

Aquí hay un ejemplo de una consulta de 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 el caso de la marca de tiempo, use java.sql.Timestamp y 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); 

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

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

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

En Android es muy simple. Solo 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

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 lo opuesto:

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

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 antiguas clases problemáticas de fecha y hora que ahora son heredadas, suplantadas por las modernas clases java.time .

Aparentemente está almacenando un momento en su base de datos en una columna de algún tipo entero. Eso es desafortunado. En su lugar, debe utilizar una columna de un tipo, como el TIMESTAMP WITH TIME ZONE estándar de 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 para un día completo, entonces necesitamos un rango de tiempo. Debemos tener un momento de inicio y un momento final. Su consulta tiene solo un criterio de fecha y hora único en el que debería haber tenido un par.

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

Un huso horario es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día cuando todavía está "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 su zona horaria deseada / esperada explícitamente como un argumento.

Especifique un nombre de zona horaria adecuada en el formato continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca utilice la abreviatura de 3-4 letras, como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).

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

Si desea utilizar el huso horario predeterminado actual de la JVM, solicítelo y pase como un 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 por cualquier código en cualquier subproceso de cualquier aplicación dentro de la JVM.

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

O especifica una fecha Puede establecer el mes por un número, con una buena cantidad de 1-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 objetos enum de Month predefinidos, uno para cada mes del año. Consejo: Use estos objetos Month en su base de código en lugar de un simple número entero para que su código sea más autodocumentado, garantice valores válidos y proporcione seguridad de tipo .

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

Con un LocalDate en la mano, debemos transformarlo en un par de momentos, el inicio y el fin del día. No suponga 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 en otro momento, como 01:00:00. Deje que java.time determine el primer momento del día. Pasamos un argumento ZoneId a LocalDate::atStartOfDay para buscar tales anomalías. El resultado es un ZonedDateTime .

 ZonedDateTime zdtStart = ld.atStartOfDay( z ) ; 

En general, el mejor enfoque para definir un lapso de tiempo es el enfoque de Medio Abierto, donde el comienzo es inclusivo, mientras que el final es exclusivo . Entonces, un día comienza con su primer momento y corre 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 para un día completo no puede hacer uso del comando SQL BETWEEN . Ese comando está Totalmente Cerrado ( [] ) (tanto el comienzo como el final son inclusivos) donde como queremos Medio Abierto ( [) ). Usamos un par de criterios >= y < .

Tu columna está mal nombrada. Evite cualquiera de las miles de palabras reservadas por varias bases de datos. Usemos placed en este ejemplo.

Tu código debería haber usado ? marcadores de posición en los que especificar nuestros momentos.

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

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

Pero, en cambio, necesitamos obtener una cuenta de época en segundos enteros. Asumiré que su fecha de referencia de época es el primer momento de 1970 en UTC. Tenga cuidado con la posible pérdida de datos, ya que la clase ZonedDateTime es capaz de 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 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 objetos Instant (siempre en UTC) o en objetos ZonedDateTime (con un huso horario asignado).

 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 posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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 las clases java.time .

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 de java.time?

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

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Me siento obligado a responder, ya que otras respuestas parecen ser un agnóstico de zona horaria que una aplicación del mundo real no puede permitirse ser. Para que la conversión de la marca de tiempo a la fecha sea correcta cuando la marca de tiempo y la JVM usan husos horarios diferentes, 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 con las bases de datos). En caso de que sus marcas de tiempo estén en diferentes zonas horarias, cambie el parámetro de la zona horaria de la statement toDate .

intente usar este código java:

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

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

 Timestamp timestamp = new Timestamp(long); date.setTime( l_timestamp.getTime() ); 
 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; 
 DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); Date fecha = getDateInTimestamp();