java.time
El enfoque moderno utiliza las clases java.time que suplantaron las problemáticas clases de fecha y hora heredadas incluidas con las primeras versiones de Java.
La java.sql.Timestamp
clase es una de esas clases heredadas. Ya no es necesario. En su lugar, use Instant
u otras clases java.time directamente con su base de datos usando JDBC 4.2 y posterior.
La Instant
clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Si debe interoperar con uno existente Timestamp
, conviértalo inmediatamente a java.time mediante los nuevos métodos de conversión agregados a las clases antiguas.
Instant instant = myTimestamp.toInstant() ;
Para ajustar a otra zona horaria, especifique la zona horaria como un ZoneId
objeto. Especificar un nombre de zona horaria correcta en el formato de continent/region
, por ejemplo America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca use las pseudozonas 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" ) ;
Aplicar al Instant
para producir un ZonedDateTime
objeto.
ZonedDateTime zdt = instant.atZone( z ) ;
Para generar una cadena para mostrar al usuario, busque Stack Overflow para DateTimeFormatter
encontrar muchas discusiones y ejemplos.
Su pregunta se trata realmente de ir en la otra dirección, desde la entrada de datos del usuario hasta los objetos de fecha y hora. Generalmente es mejor dividir la entrada de datos en dos partes, una fecha y una hora del día.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Tu pregunta no está clara. ¿Quiere interpretar que la fecha y la hora introducidas por el usuario están en UTC? ¿O en otra zona horaria?
Si nos referimos UTC, crear una OffsetDateTime
con un desplazamiento utilizando la constante de UTC, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Si se refería a otra zona horaria, combine junto con un objeto de zona horaria, a ZoneId
. ¿Pero en qué zona horaria? Es posible que detecte una zona horaria predeterminada. O, si es crítico, debe confirmar con el usuario para estar seguro de su intención.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Para obtener un objeto más simple que siempre esté en UTC por definición, extraiga un archivo Instant
.
Instant instant = odt.toInstant() ;
…o…
Instant instant = zdt.toInstant() ;
Envíe a su base de datos.
myPreparedStatement.setObject( … , instant ) ;
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 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 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 .