tutorial que libreria interfaz grafica español ejemplos contenedores componentes java date deprecated

que - libreria awt java pdf



Java: ¿por qué el constructor de fechas está en desuso y qué uso utilizo? (9)

Vengo del mundo de C #, así que no tengo mucha experiencia con Java todavía. Eclipse me dijo que la Date estaba en desuso.

Person p = new Person(); p.setDateOfBirth(new Date(1985, 1, 1));

¿Por qué? ¿Y qué (especialmente en casos como el anterior) debería usarse en su lugar?


tl; dr

LocalDate.of( 1985 , 1 , 1 )

…o…

LocalDate.of( 1985 , Month.JANUARY , 1 )

Detalles

Las clases java.util.Date , java.util.Calendar y java.text.SimpleDateFormat se apresuraron demasiado rápido cuando Java se lanzó y evolucionó por primera vez. Las clases no fueron bien diseñadas o implementadas. Se intentaron mejoras, por lo tanto, las desaprobaciones que ha encontrado. Lamentablemente, los intentos de mejora fracasaron en gran medida. Deberías evitar estas clases por completo. Ellos son suplantados en Java 8 por nuevas clases.

Problemas en su código

Un java.util.Date tiene una fecha y una porción de tiempo. Ignoraste la porción de tiempo en tu código. Por lo tanto, la clase Date tomará el comienzo del día según lo definido por la zona horaria predeterminada de su JVM y aplicará ese tiempo al objeto Date. Por lo tanto, los resultados de su código variarán según la máquina que ejecute o la zona horaria que configure. Probablemente no es lo que quieres.

Si solo desea la fecha, sin la porción de tiempo, como para una fecha de nacimiento, es posible que no desee utilizar un objeto Date . Puede guardar solo una cadena de la fecha, en formato ISO 8601 de YYYY-MM-DD . O use un objeto LocalDate de Joda-Time (vea abajo).

Joda-Time

Lo primero que debe aprender en Java: evite las notoriamente problemáticas clases java.util.Date y java.util.Calendar incluidas con Java.

Como se indicó correctamente en la respuesta de user3277382 , use Joda-Time o el nuevo paquete java.time. * En Java 8.

Código de ejemplo en Joda-Time 2.3

DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" ); DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway ); DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" ); DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork ); DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC ); LocalDate birthDate = new LocalDate( 1985, 1, 1 );

Volcado a la consola ...

System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway ); System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork ); System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt ); System.out.println( "birthDate: " + birthDate );

Cuando se ejecuta ...

birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00 birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00 birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z birthDate: 1985-01-01

java.time

En este caso, el código para java.time es casi idéntico al de Joda-Time .

Obtenemos una zona horaria ( ZoneId ) y construimos un objeto de fecha y hora asignado a esa zona horaria ( ZonedDateTime ). Luego, utilizando el patrón Objetos inmutables , creamos nuevos tiempos de fecha basados ​​en el mismo instante del objeto viejo (recuento de nanosegundos desde la epoch ) pero asignados a otra zona horaria. Por último, obtenemos un LocalDate que no tiene hora del día ni zona horaria, aunque LocalDate cuenta que se aplica la zona horaria al determinar esa fecha (por ejemplo, un nuevo día amanece antes en Oslo que en Nueva York ).

ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" ); ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway ); ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" ); ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork ); ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar. Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC. LocalDate localDate_Norway = zdt_Norway.toLocalDate();

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy 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 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 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 .
  • Android
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). 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 more .


El constructor de fecha específico está en desuso, y se debe usar un calendario en su lugar. JavaDoc for Date describe qué constructores están en desuso y cómo reemplazarlos usando un calendario.


La clase java.util.Date no está actualmente en desuso, solo ese constructor, junto con otros dos constructores / métodos están en desuso. Fue desaprobado porque ese tipo de uso no funciona bien con la internacionalización. La clase Calendar debería usarse en su lugar:

Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 1988); cal.set(Calendar.MONTH, Calendar.JANUARY); cal.set(Calendar.DAY_OF_MONTH, 1); Date dateRepresentation = cal.getTime();

Echa un vistazo a la fecha Javadoc:

Date



Me encontré con esta pregunta como un duplicado de una pregunta más reciente que preguntaba cuál era la forma no obsoleta de obtener una Date en un año, mes y día específicos.

Las respuestas hasta aquí dicen usar la clase Calendar , y eso fue cierto hasta que salió Java 8. Pero a partir de Java 8, la forma estándar de hacerlo es:

LocalDate localDate = LocalDate.of(1985, 1, 1);

Y luego, si realmente necesitas un java.util.Date , puedes usar las sugerencias en esta pregunta .

Para obtener más información, consulte LocalDate o los tutoriales para Java 8.



Tenga en cuenta que Calendar.getTime() no es determinista en el sentido de que la parte del día se ajusta por defecto a la hora actual.

Para reproducirse, intente ejecutar el código siguiente un par de veces:

Calendar c = Calendar.getInstance(); c.set(2010, 2, 7); // NB: 2 means March, not February! System.err.println(c.getTime());

Salida ej .:

Sun Mar 07 10:46:21 CET 2010

Ejecutando el mismo código exactamente un par de minutos más tarde cede:

Sun Mar 07 10:57:51 CET 2010

Entonces, mientras que set() fuerza a los campos correspondientes a corregir los valores, filtra el tiempo del sistema para los otros campos. (Probado anteriormente con Sun jdk6 y jdk7)


Una de las razones por las que el constructor está en desuso es porque el significado del parámetro del año no es el que se espera. El javadoc dice:

A partir de la versión 1.1 de JDK, reemplazado por Calendar.set(year + 1900, month, date) .

Tenga en cuenta que el campo del año es el número de años desde 1900 , por lo que su código de muestra probablemente no hará lo que espera que haga. Y ese es el punto.

En general, la API de Date solo es compatible con el calendario occidental moderno, tiene componentes especificados de manera idiosincrásica y se comporta de manera incoherente si configura los campos.

Las API Calendar y GregorianCalendar son mejores que Date , y las API Joda-time de terceros generalmente se consideraban las mejores. En Java 8, introdujeron los paquetes java.time , y estos son ahora la alternativa recomendada.