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.Timestampclase es una de esas clases heredadas. Ya no es necesario. En su lugar, use Instantu otras clases java.time directamente con su base de datos usando JDBC 4.2 y posterior.
La Instantclase 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 ZoneIdobjeto. Especificar un nombre de zona horaria correcta en el formato de continent/region, por ejemplo America/Montreal, Africa/Casablancao Pacific/Auckland. Nunca use las pseudozonas de 3-4 letras como ESTo ISTya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Aplicar al Instantpara producir un ZonedDateTimeobjeto.
ZonedDateTime zdt = instant.atZone( z ) ;
Para generar una cadena para mostrar al usuario, busque Stack Overflow para DateTimeFormatterencontrar 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 OffsetDateTimecon 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 .