Respuestas:
Por Timestamp
, supongo que quieres decir java.sql.Timestamp
. Notarás que esta clase tiene un constructor que acepta un long
argumento. Puedes analizar esto usando la DateFormat
clase:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
y java.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y versiones posteriores. Consulte el tutorial de Oracle .
¿Qué pasa con esto?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
¿Qué quieres decir con la marca de tiempo? Si te refieres a milisegundos desde la época de Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Si desea un objeto java.sql.Timestamp real:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Actualicemos esta página mostrando el código usando java.time marco integrado en Java 8 y posteriores.
Estas nuevas clases están inspiradas en Joda-Time , definida por JSR 310 y ampliada por ThreeTen-Extra proyecto . Sustituyen a las antiguas clases de fecha y hora notoriamente problemáticas incluidas con las primeras versiones de Java.
En java.time, an Instant
es un momento en la línea de tiempo en UTC. A ZonedDateTime
es un Instant ajustado a una zona horaria ( ZoneId
).
La zona horaria es crucial aquí. Una fecha deSeptember 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 antes en París que en Montreal, donde todavía es “ayer”.
Además, un java.sql.Timestamp representa tanto una fecha como una hora del día. Por lo tanto, debemos inyectar una hora del día para que coincida con la fecha. Suponemos que desea que el primer momento del día sea la hora del día. Tenga en cuenta que este no es siempre el momento00:00:00.0
debido al horario de verano y posiblemente a otras anomalías.
Tenga en cuenta que, a diferencia de la antigua clase java.util.Date, y a diferencia de Joda-Time, los tipos java.time tienen una resolución de nanosegundos en lugar de milisegundos. Esto coincide con la resolución de java.sql.Timestamp.
Tenga en cuenta que java.sql.Timestamp tiene la mala costumbre de aplicar implícitamente la zona horaria predeterminada actual de su JVM a su valor de fecha y hora al generar una representación de cadena a través de su toString
método. Aquí puede ver mi America/Los_Angeles
zona horaria aplicada. Por el contrario, las clases java.time son más sensatas, utilizando el estándar ISO 8601 formatos .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( 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 los tipos java.time directamente. No es necesario java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
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 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 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*
clases.
¿Dónde obtener las clases java.time?
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 .
También puede 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());
Según la API, el constructor que aceptaría año, mes, etc. está obsoleto. En su lugar, debe usar el Constructor que acepta un archivo. Puede usar una implementación de Calendario para construir la fecha que desee y acceder a la representación de tiempo como un largo, por ejemplo, con el método getTimeInMillis .
En aras de la integridad, 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())
DateTime
objeto. Eso significa que sus resultados variarán entre varias computadoras o la configuración del sistema operativo host o la configuración de JVM. Para obtener resultados predecibles, pase una zona horaria a ese DateTime
constructor. Elija el nombre de la zona horaria adecuada para su intención. Por ejemplo, DateTimeZone.forID( "America/Montreal" )
o DateTimeZone.UTC
.
DateTime
objeto sus milisegundos desde la época. Reemplazar .toDate().getTime()
con .getMillis()
.
DateTimeZone.getDefault()
y pasando el resultado como argumento opcional. (Por cierto, lo mismo ocurre con el Locale.getDefault()
mismo problema sobre la ambigüedad de los argumentos opcionales.)
Una respuesta más general sería importar java.util.Date
, luego, cuando necesite establecer un timestamp
igual a la fecha actual, simplemente configúrelo igual a new Date()
.