tl; dr
aconsejar la "mejor práctica" actual en torno Date
yCalendar
es la mejor forma de favorecer siempre Calendar
por encimaDate
Evite estas clases heredadas por completo. Use java.time clases lugar.
- Por un momento en UTC , use
Instant
(el equivalente moderno deDate
)
- Por un momento en una zona horaria particular , use (el equivalente moderno de
ZonedDateTime
GregorianCalendar
)
- Por un momento en un desplazamiento particular desde UTC , use
OffsetDateTime
(sin equivalente en clases heredadas)
- Para una fecha y hora (no un momento) con zona horaria o desplazamiento desconocidos, use (sin equivalente en las clases heredadas)
LocalDateTime
Detalles
La respuesta de Ortomala Lokni es correcta al sugerir el uso de las clases modernas de java.time en lugar de las antiguas y problemáticas clases de fecha y hora heredadas ( Date
,Calendar
, etc.). Pero esa respuesta sugiere la clase incorrecta como equivalente (ver mi comentario sobre esa respuesta).
Usando java.time
Las clases java.time son una gran mejora con respecto a las clases heredadas de fecha y hora, la diferencia de día y noche. Las viejas clases están mal diseñadas, son confusas y problemáticas. Debe evitar las clases antiguas siempre que sea posible. Pero cuando necesite convertir a / de lo antiguo / nuevo, puede hacerlo llamando a nuevos métodos add to the old clases .
Para obtener más información sobre la conversión, vea mi respuesta y diagrama ingenioso a otra pregunta, Convertir java.util.Date a qué tipo de "java.time"?.
Search Stack Overflow ofrece muchos cientos de preguntas y respuestas de ejemplo sobre el uso de java.time. Pero aquí hay una sinopsis rápida.
Instant
Obtenga el momento actual con un Instant
. 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 = Instant.now();
ZonedDateTime
Para ver ese mismo momento simultáneo a través de la lente del reloj de pared de una región en particular , aplique una zona horaria ( ZoneId
) para obtener a ZonedDateTime
.
Zona horaria
Especificar un nombre de zona horaria correcta en el formato de continent/region
, por ejemplo America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca use el 3-4 abreviatura de letras tales como EST
o IST
, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Compensar
Una zona horaria es el historial de cambios de una región en su desplazamiento desde UTC . Pero a veces solo se le da un desplazamiento sin la zona completa. En ese caso, usa la OffsetDateTime
clase.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
El uso de una zona horaria es preferible al uso de un mero desplazamiento.
LocalDateTime
El "Local" en las Local…
clases significa cualquier localidad, no una localidad particular. Entonces el nombre puede ser contra-intuitivo.
LocalDateTime
, LocalDate
y LocalTime
carecen deliberadamente de información sobre desplazamiento o zona horaria. Así que ellos no representan momentos reales, que son no los puntos de la línea de tiempo. En caso de duda o confusión, use en ZonedDateTime
lugar de LocalDateTime
. Buscar Stack Overflow para mucha más discusión.
Instrumentos de cuerda
No combine objetos de fecha y hora con cadenas que representen su valor. Puede analizar una cadena para obtener un objeto de fecha y hora, y puede generar una cadena a partir de un objeto de fecha y hora. Pero la cadena nunca es la fecha-hora misma.
Aprenda sobre los formatos estándar ISO 8601 , utilizados por defecto en las clases java.time.
Sobre 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 .
Con un controlador JDBC compatible con JDBC 4.2 o posterior, puede intercambiar java.time objetos directamente con su base de datos. No necesita cadenas ni clases java.sql. *.
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar 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 java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
- Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
- Para principios de Android, el ThreeTenABP proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver 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 .