java.time
El enfoque moderno utiliza el java.time clases que suplantaron las clases heredadas de fecha y hora molestos que vienen con las primeras versiones de Java.
La clase java.sql.Timestamp
es una de esas clases heredadas. Ya no es necesario. En su lugar, use Instant
u otras clases de java.time directamente con su base de datos usando JDBC 4.2 y posterior.
La clase Instant
representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).
Instant instant = myResultSet.getObject(… , Instant.class) ;
Si debe interoperar con un Timestamp
existente, convertir inmediatamente en java.time a través de los nuevos métodos de conversión añadido a las viejas clases.
Instant instant = myTimestamp.toInstant() ;
Para ajustar a otra zona horaria, especifique la zona horaria como un objeto ZoneId
. Especifique un proper time zone name en el formato de continent/region
, como America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca use las pseudo-zonas de 3-4 letras como EST
o IST
ya que son no zonas horarias verdaderas, no estandarizadas, y ni siquiera únicas (!).
ZoneId z = ZoneId.of("America/Montreal") ;
se aplican a la Instant
para producir un objeto ZonedDateTime
.
ZonedDateTime zdt = instant.atZone(z) ;
para generar una cadena para ser presentado al usuario, búsqueda de desbordamiento de pila para DateTimeFormatter
encontrar muchas discusiones y ejemplos.
Su pregunta es realmente acerca de ir en la otra dirección, desde la entrada de datos del usuario hasta los objetos de fecha y hora. Por lo general, es mejor romper su ingreso 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á nada clara. ¿Desea interpretar la fecha y la hora ingresadas por el usuario para estar en UTC? ¿O en otra zona horaria?
Si se refería a UTC, cree un OffsetDateTime
con un desplazamiento usando la constante para UTC, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of(ld , lt , ZoneOffset.UTC) ;
Si usted significó otra zona horaria, se combinan junto con un objeto de zona horaria, una ZoneId
. Pero, ¿qué zona horaria? Puede detectar 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 está siempre en UTC, por definición, extraer un Instant
.
Instant instant = odt.toInstant() ;
... o ...
Instant instant = zdt.toInstant() ;
enviar a su base de datos.
myPreparedStatement.setObject(… , instant) ;
Sobre java.time
El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date
, Calendar
, & SimpleDateFormat
.
El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.
Para obtener más información, consulte el Oracle Tutorial. 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 más tarde
- incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
- Android
- Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
- Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….
El proyecto se extiende ThreeTen-Extra 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 more.
¿Por qué solo está cambiando la zona horaria y no está convirtiendo la fecha/hora junto con ella? –
Es realmente molesto tomar una fecha Java que está en una zona horaria, y obtener * esa * fecha en otra zona horaria. IE, tome 5PM EDT y obtenga 5PM PDT. – mtyson