Cuando observa el javadoc de la clase java.util.Date, la mayoría de los métodos están en desuso. ¿Por qué se hizo esto?¿Por qué se desaprobaron la mayoría de los métodos java.util.Date?
Respuesta
Bueno, por dos razones relacionadas. Fue una implementación muy pobre del concepto de Fechas y horarios y fue reemplazada por la clase Calendar
.
La clase Calendar
, aunque una mejora, deja mucho que desear también, por lo que para el trabajo serio de Fecha/Hora, todos recomiendan Joda-Time. Java 8 trae el nuevo java.time.* package, inspirado en Joda-Time, definido por JSR-310, y destinado a suplantar las antiguas clases de Fecha/Calendario.
Editar: En respuesta a la pregunta específica de por qué la implementación es pobre, hay muchas razones. JavaDoc lo resume de la siguiente manera:
Desafortunadamente, la API para estas funciones no era susceptible de internacionalización.
Además de esta deficiencia general (que abarca cuestiones como la falta de un componente de zona horaria, así como el formato de fecha que se maneja mejor en DateFormat
y la incapacidad para tener una representación de calendario no gregoriano), hay son cuestiones específicas que realmente perjudicaron la clase Date
, incluido el hecho de que el año se presenta en una desviación de 1900 del año de la Era Común.
Calendar
tiene sus propios problemas, pero incluso tan pronto como JDK 1.1 era obvio que java.util.Date
no iba a cortarlo. A pesar de que Calendar
es discutible, la peor API de JDK, hasta la versión 7 se intentó intentar abordarla.
Están en desuso porque Fecha fue escrita lo más rápido posible en el día en que querían apresurar el JDK por la puerta.
Resulta que las fechas y los calendarios son duros. Entonces, crearon la clase Calendar, que pensó mucho más, para manejar las partes difíciles de trabajar con calendarios.
Desaprobaron los métodos de fecha y se delegaron en el calendario porque no deseaban cambiar el comportamiento de los métodos de fecha existentes y posiblemente interrumpir las aplicaciones existentes.
Date
es mutableDate
no tiene soporte para zonas horarias
Este último llevado a ser reemplazado por Calendar
. Y el anterior, combinado con la facilidad de uso-, conducir a la vez que se sustituye por Joda-Time/JSR-310 (java.time.* package)
JSR-310, no JSR-313. – Jesper
Gracias IBM por Calendar, DateFormatter y todas las otras porquerías asociadas. Otro ejemplo brillante de sobreingeniería sin resolver realmente el problema en cuestión. –
No sé la razón oficial por la que ya no se utiliza, pero en lo que puedo decir GregorianCalendar
y Joda-Time admiten operaciones en fechas, lo que significa que puede agregar, por ejemplo, un día a una fecha y tener su mes y año actualizados en consecuencia.
Por ejemplo, supongamos que desea calcular el día posterior a la fecha actual y hoy es el 31 de mayo; con java.util.Date
, solo tiene getDays() +1
, que devuelve 32, y debe saber que el mes actual no tiene 32 días; con GregorianCalendar
o Joda.time, agregar un día al 31 de mayo da como resultado un objeto que representa el 1 de junio, ocultando la complejidad de su vista.
Su ejemplo no es un problema con el objeto Date, pero con el código que lo usa. GregorianCalendar haría exactamente lo mismo. Entonces, todo ese punto es discutible. – Supericy
He aquí una buena respuesta directa de Oracle: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
Una pesadilla de larga data de los desarrolladores de Java ha sido el apoyo insuficiente a los casos de fecha y el uso del tiempo de los desarrolladores ordinarios.
Por ejemplo, las clases existentes (como
java.util.Date
ySimpleDateFormatter
) no son seguras para subprocesos, lo que genera posibles problemas de simultaneidad para los usuarios, algo que el desarrollador promedio esperaría al escribir el código de manejo de fecha.Algunas de las clases de fecha y hora también muestran un diseño API bastante pobre. Por ejemplo, los años en
java.util.Date
comienzan a las 1900, los meses comienzan en 1 y los días comienzan en 0, lo que no es muy intuitivo....
java.util.Date
representa un instante en la línea de tiempo -una envoltura alrededor del número de milisegundos desde la época UNIX- pero si llama a String(), el resultado sugiere que tiene una zona horaria, lo que causa confusión entre desarrolladores.
Parece que el autor no se molestó en corregir su artículo. A partir de la documentación en línea de Java [java.util.Date] (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html), los días comienzan en '1' y los meses comienzan en '0'. Ambos se corresponden con la API de UNIX, ver [time.h] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html). –
- 1. ¿Por qué la mayoría de los ejemplos que usan ArrayList
- 2. ¿Por qué no se permite sobrecargar los métodos dentro de los métodos (por ejemplo, cierres sobrecargados)?
- 3. ¿Por qué la mayoría de los lenguajes de S-Expression se tipan dinámicamente?
- 4. ¡La mayoría de los métodos Iteradores e Iterables son LAZY! ¿Qué significa esto?
- 5. ¿Por qué se desaprobaron las clases de caso sin una lista de parámetros?
- 6. ¿Por qué las listas de visualización se desaprobaron en OpenGL 3.1?
- 7. ¿Por qué los métodos auxiliares se usan frecuentemente en Javascript?
- 8. ¿Por qué Java es utilizado por la mayoría de los bancos?
- 9. ¿Los métodos PUT, DELETE, HEAD, etc. están disponibles en la mayoría de los navegadores web?
- 10. ¿No se pueden reemplazar todos o la mayoría de los casos de `cada uno 'por` mapa`?
- 11. ¿Por qué la mayoría de los algoritmos de gráficos no se adaptan tan fácilmente a los números negativos?
- 12. ¿Por qué los métodos de la clase Math están estáticos?
- 13. ¿Por qué obtengo los métodos de la clase base por reflexión cuando la subclase los anula?
- 14. ¿Por qué la API de Java de fecha (java.util.Date, .Calendar) es un desastre?
- 15. ¿Por qué no se resuelven estos métodos?
- 16. ¿Por qué la mayoría de los ejemplos de Delphi utilizan FillChar() para inicializar registros?
- 17. ¿Por qué la mayoría de los lenguajes de scripting no tienen tipeo?
- 18. Serializando java.util.Date
- 19. ¿Por qué la mayoría de los lenguajes orientados a objetos no admiten corutinas?
- 20. ¿Por qué java.util.Date me está dando el mal momento?
- 21. ¿Por qué se usan los signos de admiración en los métodos de Ruby?
- 22. ¿Por qué la mayoría del código del controlador de muestra MVC devuelve ActionResult?
- 23. ¿Por qué UITableView llama a los métodos delegados de UIScrollView?
- 24. ¿Por qué la mayoría de los lenguajes de programación utilizan una evaluación entusiasta para los argumentos pasados a una función?
- 25. ¿Por qué no puede invocar los métodos de extensión directamente?
- 26. por qué los métodos de extensión en C# Class Libraries
- 27. Por qué los métodos de interfaz no tienen cuerpo
- 28. Encontrar la mayoría de los objetos repetidos en la matriz
- 29. ¿Por qué usamos "esto" en los Métodos de extensión?
- 30. ¿En qué orden se llaman los métodos de enlace UITableView?
Cleanly haciendo la transición de inadecuado a incomprensible en jdk 1.1 :) – msandiford
También la clase 'Fecha' fue nombrada mal. Deberían haberlo llamado Hora o Fecha y hora. –