nacimiento - private date fecha java
¿Cuál es la mejor manera de manipular fechas y marcas de tiempo en Java? (10)
El proyecto Apache Commons Lang tiene una clase DateUtils
que realiza operaciones de fecha útiles.
Yo uso mucho DateUtils.truncate()
, lo cual "pondrá a cero" partes de la Fecha por usted (útil si desea que su objeto Date represente, por ejemplo, una fecha y no incluya ninguna información de tiempo). Cada método funciona tanto para objetos de Date
como de Calendar
.
Cada vez que necesito trabajar con fechas y / o timstamps en Java, siempre siento que estoy haciendo algo mal y paso largas horas tratando de encontrar una forma mejor de trabajar con las API sin tener que codificar mis propias clases de utilidad Date and Time. . Aquí hay un par de cosas molestas con las que me topé:
0 meses basados Me doy cuenta de que la mejor práctica es usar Calendar.SEPTEMBER en lugar de 8, pero es molesto que 8 represente septiembre y no agosto.
Obtener una fecha sin una marca de tiempo. Siempre necesito la utilidad que pone a cero la parte de la marca de tiempo de la fecha.
Sé que hay otros problemas que tuve en el pasado, pero no recuerdo. Siéntase libre de agregar más en sus respuestas.
Entonces, mi pregunta es ... ¿Qué API de terceros usas para simplificar el uso de Java de la manipulación de fecha y hora, si corresponde? ¿Alguna idea sobre usar Joda ? ¿Alguien miró más de cerca la API de fecha y hora JSR-310?
Es lo mismo en javascript. Alguien debe haber estado fumando algo cuando creen que es una buena idea dejar que 2008 signifique el año 2008, 31 que signifique el día 31 del mes, y - esta es la mejor parte - 11 significa el 12 ° mes.
Por otro lado, lo hicieron bien en dos de tres.
Es realmente simple escribir su propia API de fecha que se encuentra sobre las clases en bruto de Java, fecha y calendario. Básicamente, tanto la fecha como el calendario adolecen del hecho de que intentan incluir dos conceptos en una sola clase:
- Fecha (es decir, año-mes-día)
- Instantáneo (es decir, CurrentTimeMillis)
Cuando comprenda esto, simplemente revolucionará la forma en que maneja los conceptos tipo fecha en su código. Las cosas serán más simples, más claras, mejores. ¡En todo sentido!
Para mí, Joda es demasiado complicado, al menos para la abrumadora mayoría de los propósitos y particularmente no me gusta el hecho de que hayan ido en contra de los formularios estándar de Java, un ejemplo de cómo analizar y formatear las fechas. Stephen Colebourne, el hombre detrás de JODA, es el líder de especificación de JSR-310 y esto tiene los mismos problemas que yo (he seguido y contribuido a las discusiones de los últimos años).
Hazlo tu mismo; es fácil. Solo complete las siguientes clases: MyDate (ajuste año-mes-día), Month (una enumeración), TimeOfDay (hora-min-seg-millis), DayOfWeek (enumeración), Instant (envoltura larga). Siempre considere las zonas horarias al convertir entre Instantes y Fechas.
Si esto parece desalentador, puede usar Calendar y SimpleDateFormat debajo del capó. Harás esto en un día y nunca lo lamentarás.
Estoy usando GregorianCalendar - siempre y en todas partes. Simple java.util.Date es demasiado complejo, sí.
Entonces, mi consejo es - usa GC, es simple
Las API de fecha son muy difíciles de diseñar, especialmente si tienen que lidiar con la localización. Intente hacer su propia jugada y vea, vale la pena hacerlo al menos una vez. El hecho de que Joda haya podido hacer un buen trabajo es un verdadero mérito para sus desarrolladores. Para responder a su pregunta, solo escuché cosas buenas de esa biblioteca, aunque nunca había jugado con ella.
Lo que siempre me atrapa con Java es la biblioteca de fecha y hora. Nunca he usado Joda, solo lo miro brevemente, parece que es una implementación bastante buena, y si entiendo JSR-130 correctamente es tomar conocimiento de Joda y finalmente tenerlo incluido en JavaSE.
Muy a menudo para proyectos anteriores he envuelto los objetos de fecha y hora Java, que en sí mismo era toda una tarea. Luego usé las envolturas para la manipulación de la fecha.
Muchos programadores comienzan con el uso de Date, que tiene numerosos constructores sobrecargados en desuso (por lo que es difícil de usar), pero una vez que descubres GregorianCalendar se vuelve un poco más fácil de administrar. El ejemplo aquí es bastante útil:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html
He estado usando Joda exclusivamente durante tres años y definitivamente lo recomendaría, tiene todo el área cubierta con una interfaz que ''hace lo que dice''.
Joda puede parecer complejo cuando comienzas, como por ejemplo, tiene conceptos de períodos, duración e intervalos que parecen algo similares, pero puedes comenzar simplemente sustituyendo org.joda.time.DateTime
(u org.joda.time.DateMidnight
) para java.util.Date
en su código, y seguir con los muchos métodos útiles que contienen esas clases, antes de comprender las otras áreas.
Esta publicación tiene una buena discusión sobre la comparación de la fecha / hora API de Java frente a JODA.
Personalmente utilizo Gregorian Calendar y SimpleDateFormat cada vez que necesito manipular fechas / horas en Java. Nunca tuve problemas para usar la API de Java y la encontré bastante fácil de usar, por lo que realmente no he buscado alternativas.
java.time
Java 8 y versiones posteriores ahora incluyen el marco java.time . Inspirado por Joda-Time , definido por JSR 310 , extendido por el proyecto ThreeTen-Extra . Ver el tutorial .
Este marco reemplaza las antiguas clases java.util.Date/.Calendar. Los métodos de conversión le permiten realizar conversiones de ida y vuelta para trabajar con código antiguo que aún no se ha actualizado para los tipos de java.time.
Las clases principales son:
Instant
Un momento en la línea de tiempo, siempre en UTC .-
ZoneId
Una zona horaria La subclaseZoneOffset
incluye una constante para UTC . -
ZonedDateTime
=ZoneId
+ZoneId
Representa un momento en la línea de tiempo ajustada en una zona horaria específica.
Este marco resuelve el par de problemas que enumeró.
Meses basados en 0
Los números de mes son 1-12 en java.time.
Aún mejor, un Enum
( Month
) proporciona una instancia de objeto para cada mes del año. Entonces no necesita depender de números "mágicos" en su código como 9
o 10
.
if ( theMonth.equals ( Month.OCTOBER ) ) { …
Además, esa enumeración incluye algunos prácticos métodos de utilidad, como obtener el nombre localizado de un mes.
Si aún no está familiarizado con las enumeraciones de Java, lea el Tutorial y estudie. Son sorprendentemente prácticos y poderosos.
Una cita sin tiempo
La clase LocalDate
representa un valor de solo fecha, sin hora del día, sin zona horaria.
LocalDate localDate = LocalDate.parse( "2015-01-02" );
Tenga en cuenta que determinar una fecha requiere un huso horario. Un nuevo día amanece antes en París que en Montreal, donde todavía es "ayer". La clase ZoneId
representa una zona horaria.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Del mismo modo, hay una clase LocalTime
para una hora del día que aún no está vinculada a una fecha u huso horario.
Acerca de java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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 para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases de 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 y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- Consulte Cómo utilizar ThreeTenABP ....
El proyecto ThreeTen-Extra amplía 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 más .