localdatetime ejemplo java date datetime java-time

ejemplo - string to date java



Convertir java.util.Date a qué tipo de "java.time"? (1)

Sí, definitivamente deberías usar el marco java.time siempre que sea posible.

Evitar las clases antiguas de fecha y hora.

Las antiguas clases de fecha y hora, incluyendo java.util.Date , java.util.Calendar y java.text.SimpleTextFormat y tales, han demostrado estar mal diseñadas, confusas y problemáticas . Evítalos donde puedas. Pero cuando debe interoperar con estos tipos antiguos, puede convertir entre antiguos y nuevos.

Siga leyendo para obtener una introducción básica, un tanto simplificada, para orientarlo en el movimiento hacia adelante y hacia atrás entre las clases de fecha y hora antiguas y nuevas.

java.time

El marco java.time está definido por JSR 310 , inspirado en la exitosa biblioteca Joda-Time y ampliado por el proyecto ThreeTen-Extra . La mayor parte de la funcionalidad fue respaldada a Java 6 y 7 en el proyecto ThreeTen-Backport , con una adaptación adicional para Android en el proyecto ThreeTenABP .

¿Qué tipo de java.time coincide con java.util.Date ? Bueno, un objeto java.util.Date básicamente representa un momento en la línea de tiempo en UTC, una combinación de una fecha y una hora del día. Podemos traducir eso a cualquiera de varios tipos en java.time. Cada uno se discute a continuación. Tenga en cuenta que se han agregado algunos métodos nuevos a las antiguas clases de fecha y hora para facilitar las conversiones.

Instant

El bloque de creación en java.time es un Instant , un momento en la línea de tiempo en UTC con una resolución de nanoseconds .

Generalmente deberías hacer gran parte de tu lógica de negocio en UTC. En tal trabajo, Instant se utilizará con frecuencia. Pase los objetos Instant , aplicando una zona horaria solo para la presentación a un usuario. Cuando necesite aplicar un desplazamiento o zona horaria, use los tipos que se describen más adelante.

De java.util.Date a Instant

Dado que tanto Instant como java.util.Date son un momento en la línea de tiempo en UTC, podemos pasar fácilmente de un java.util.Date a un Instant . La clase anterior ha ganado un nuevo método, java.util.Date::toInstant .

Instant instant = myUtilDate.toInstant();

Puede ir en la otra dirección, desde un Instant a un java.util.Date . Pero puedes perder información sobre el segundo fraccional. Un Instant rastrea nanoseconds , hasta nueve dígitos después del lugar decimal, como 2016-01-23T12:34:56.123456789Z . Ambos java.util.Date y .Calendar están limitados a milliseconds , hasta tres dígitos después del lugar decimal, como 2016-01-23T12:34:56.123Z . En este ejemplo, pasar de Instant a Date significa truncamiento del 456789 .

java.util.Date myUtilDate = java.util.Date.from( instant );

De java.util.Calendar a Instant

¿Qué pasa con un java.util.Calendar lugar de un java.util.Date ? En el interior del objeto Calendar la fecha y hora se rastrea como un conteo de milliseconds desde la fecha y hora de referencia de la época del primer momento de 1970 en UTC ( 1970-01-01T00:00:00.0Z ). Por lo que este valor se puede convertir fácilmente en un Instant .

Instant instant = myUtilCalendar.toInstant() ;

De java.util.GregorianCalendar a ZonedDateTime

Aún mejor, si su objeto java.util.Calendar es en realidad un java.util.GregorianCalendar , puede ir directamente a ZonedDateTime . Este enfoque tiene la ventaja de conservar la información de zona horaria incorporada.

Downcast desde la interface del Calendar a la clase concreta de GregorianCalendar . Luego llame a toZonedDateTime y from métodos para ir y venir.

if( myUtilCalendar instanceof GregorianCalendar ) { GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class. ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar` end if

Yendo en la otra dirección ...

java.util.Calendar myUtilCalendar = java.util.GregorianCalendar.from( zdt ); // Produces an instant of `GregorianCalendar` which implements `Calendar` interface.

Como se mencionó anteriormente, tenga en cuenta que puede estar perdiendo información sobre la fracción de segundo . Los nanoseconds en el tipo java.time ( ZonedDateTime ) se truncan a milliseconds en el .Calendar / .GregorianCalendar .

OffsetDateTime

Desde un Instant podemos aplicar un offset-from-UTC para pasar a una hora de reloj de pared para alguna localidad. Un desplazamiento es una cantidad de horas, y posiblemente minutos y segundos, antes de UTC (este) o detrás de UTC (oeste). La clase ZoneOffset representa esta idea. El resultado es un objeto OffsetDateTime .

ZoneOffset offset = ZoneOffset.of( "-04:00" ); OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );

Puede ir en la otra dirección, desde un OffsetDateTime a un java.util.Date . Extraiga un Instant y luego proceda como vimos en el código anterior. Como se discutió anteriormente, cualquier nanoseconds se trunca a milliseconds ( pérdida de datos ).

java.util.Date myUtilDate = java.util.Date.from( odt.toInstant() );

ZonedDateTime

Mejor aún, aplicar una zona horaria completa. Una zona horaria es un desplazamiento más las reglas para el manejo de anomalías, como el horario de verano (DST) .

Al aplicar un ZoneId , ZonedDateTime un objeto ZonedDateTime . Utilice un nombre de zona horaria adecuado (continente / región). Nunca use las abreviaturas de 3-4 letras que se ven comúnmente, como EST o IST ya que no están estandarizadas ni son únicas.

ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Puede ir en la otra dirección, desde un ZonedDateTime a un java.util.Date . Extraiga un Instant y luego proceda como vimos en el código anterior. Como se discutió anteriormente, cualquier nanoseconds se trunca a milliseconds ( pérdida de datos ).

java.util.Date myUtilDate = java.util.Date.from( zdt.toInstant() );

Y vimos más arriba que un ZonedDateTime se puede convertir en un GregorianCalendar .

LocalDate

En ocasiones, es posible que desee un valor de solo fecha, sin hora del día y sin zona horaria. Para eso, usa un objeto java.time.LocalDate .

Consulte esta Pregunta para obtener más información, Convierta java.util.Fecha a java.time.LocalDate , especialmente esta Respuesta escrita por el hombre principal detrás de la invención de Joda-Time y java.time.

La clave es pasar por un ZonedDateTime (como se genera en el código anterior). Necesitamos una zona horaria para determinar una fecha. La fecha varía en todo el mundo, con un nuevo día amaneciendo en el este. Por ejemplo, después de la medianoche en París es un nuevo día, mientras que todavía es "ayer" en Montreal. Entonces, mientras que una LocalDate no contiene una zona horaria, se requiere una zona horaria para determinar una LocalDate .

LocalDate localDate = zdt.toLocalDate();

Convertir en la otra dirección de LocalDate a una fecha y hora significa inventar una hora del día. Puede elegir cualquier hora del día que tenga sentido en el escenario de su negocio. Para la mayoría de las personas, el primer momento del día tiene sentido. Es posible que tenga la tentación de codificar el código duro ese primer momento como la hora 00:00:00.0 . En algunas zonas horarias, es posible que esa hora no sea válida como primer momento debido al horario de verano (DST) u otras anomalías. Entonces, deje que java.time determine la hora correcta con una llamada a atStartOfDay .

ZonedDateTime zdt = localDate.atStartOfDay( zoneId );

LocalTime

En raras ocasiones es posible que desee solo una hora del día sin una fecha y sin una zona horaria. Este concepto está representado por la clase LocalTime . Como se mencionó anteriormente con LocalDate , necesitamos una zona horaria para determinar un LocalTime aunque el objeto LocalTime no contenga (no "recuerde") esa zona horaria. Así que, nuevamente, pasamos por un objeto ZonedDateTime obtenido de un Instant como se ve arriba.

LocalTime localTime = zdt.toLocalTime();

LocalDateTime

Al igual que con los otros dos tipos Local… , un LocalDateTime no tiene zona horaria ni desplazamiento asignado. Como tal , rara vez puedes usar esto. Le da una idea aproximada de una fecha y hora, pero no es un punto en la línea de tiempo. Use esto si quiere decir alguna fecha general y alguna hora que podría aplicarse a una zona horaria.

Por ejemplo, "La Navidad comienza este año" sería 2016-12-25T00:00:00.0 . Tenga en cuenta la falta de cualquier desplazamiento o zona horaria en esa representación textual de LocalDateTime . La Navidad comienza antes en Delhi, India, que en París, Francia, y luego en Montreal, Quebec, Canadá. La aplicación de cada zona horaria de esas áreas daría un momento diferente en la línea de tiempo.

LocalDateTime ldt = zdt.toLocalDateTime();

Tengo un objeto java.util.Date o un objeto java.util.Calendar . ¿Cómo convierto eso al tipo correcto en el marco java.time ?

He escuchado que ahora deberíamos estar haciendo la mayor parte de nuestra lógica comercial con los tipos java.time. Cuando se trabaja con código antiguo que aún no se ha actualizado para java.time, necesito poder realizar conversiones de ida y vuelta. ¿Qué tipos se asignan a java.util.Date o java.util.Calendar ?