Java Timestamp - ¿Cómo puedo crear una marca de tiempo con la fecha 23/09/2007?


¿Cómo puedo crear una marca de tiempo con la fecha 23/09/2007?

Author: Glen, 2009-06-10

8 answers

Por Timestamp, supongo que te refieres a java.sql.Timestamp. Notará que esta clase tiene un constructor que acepta un argumento long. Puedes analizar esto usando la clase DateFormat:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
 134
Author: Adam Paynter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-10 11:19:54

¿Qué pasa con esto?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
 99
Author: pigouina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 10:27:58

¿Qué quiere decir con marca de tiempo? Si quiere decir milisegundos desde la época Unix:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

Si quieres un java real.SQL.Objeto de marca de tiempo:

Timestamp ts = new Timestamp(millis);
 16
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-10 13:54:02

Tl;dr{[14]]}
java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

Java.time

Vamos a actualizar esta página mostrando el código usando el java .time framework integrado en Java 8 y posteriores.

Estas nuevas clases están inspiradas en Joda-Time, definido por JSR 310, y ampliado por el proyecto ThreeTen-Extra. Suplantan las notoriamente problemáticas antiguas clases de fecha y hora incluidas con las primeras versiones de Java.

En java.tiempo, un Instant es un momento en la línea de tiempo en UTC. A ZonedDateTime es un Instante ajustado en una zona horaria (ZoneId).

La zona horaria es crucial aquí. Una fecha de September 23, 2007 no se puede traducir a un momento en la línea de tiempo sin aplicar una zona horaria. Considere que un nuevo día amanece más temprano en París que en Montreal, donde todavía es "ayer".

También, un java.SQL.Timestamp representa tanto la fecha como la hora del día. Así que debemos inyectar una hora del día para ir junto con la fecha. Asumimos que desea el primer momento del día como la hora del día. Tenga en cuenta que esta no es siempre la hora 00:00:00.0 debido al horario de verano y posiblemente otras anomalías.

Tenga en cuenta que a diferencia de la antigua java.útil.Date class, y a diferencia de Joda-Time, el java.los tipos de tiempo tienen una resolución de nanosegundos en lugar de milisegundos. Esto coincide con la resolución de Java.SQL.Marca de tiempo.

Tenga en cuenta que el java.SQL.Timestamp tiene el desagradable hábito de aplicar implícitamente la zona horaria predeterminada actual de su JVM a su valor de fecha y hora al generar una cadena representación a través de su método toString. Aquí puede ver mi America/Los_Angeles zona horaria aplicada. En contraste, el java.las clases de tiempo son más sanas, usando formatos estándar ISO 8601.

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;

Volcar a la consola.

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );

Cuando se ejecuta.

D: 2007-09-23 = zdt: 2007-09-23T00:00-04:00[America/Montreal] = instant: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00:00.0

Por cierto, a partir de JDBC 4.2, puede usar java.tipos de tiempo directamente. No es necesario java.sql.Timestamp.

  • PreparedStatement.setObject
  • ResultSet.getObject
 7
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-21 16:50:57

De acuerdo con la API el constructor que aceptaría year, month, etc., está en desuso. En su lugar, debe utilizar el Constructor que acepta un largo. Puede usar una implementación Calendar para construir la fecha que desea y acceder a la representación de tiempo como un largo, por ejemplo con el método getTimeInMillis .

 4
Author: Philipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-10 11:31:39

También puedes hacer lo siguiente:

// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
 4
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-10 14:02:02

Para completar, también una solución con Joda-Time versión 2.5 y su DateTime clase:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
 1
Author: user152468,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-13 07:59:02

Una respuesta más general sería importar java.util.Date, luego cuando necesite establecer un timestamp igual a la fecha actual, simplemente establézcalo igual a new Date().

 -1
Author: CSquid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-28 02:31:06