Muy a menudo me encuentro con comentarios negativos sobre Java Date
y otras clases relacionadas con la fecha y la hora. Siendo un desarrollador de .NET, no puedo entender completamente (sin haberlos usado), lo que realmente está mal con ellos.
¿Alguien puede arrojar algo de luz sobre esto?
Respuestas:
Ah, la
Date
clase de Java . Quizás uno de los mejores ejemplos de cómo no hacer algo en cualquier idioma, en cualquier lugar. ¿Dónde empiezo?La lectura de JavaDoc puede llevar a uno a pensar que los desarrolladores en realidad tienen buenas ideas. Continúa sobre la diferencia entre UTC y GMT extensamente, a pesar de que la diferencia entre los dos es básicamente segundos intercalares (lo que ocurre muy raramente ).
Sin embargo, las decisiones de diseño realmente desperdician cualquier pensamiento de ser una API bien diseñada. Éstos son algunos de los errores favoritos:
null
. Como resultado, tenemos 0..11 (y hoy es el mes 11 del año 109). Hay un número similar de ++ y - en los meses para convertir a una cadena.Calendar
, diseñado para 'arreglar' esto, en realidad comete los mismos errores. Todavía son mutables.Date
representa aDateTime
, pero para diferir a los de SQL land, hay otra subclasejava.sql.Date
, que representa un solo día (aunque sin una zona horaria asociada).TimeZone
s asociados con aDate
, por lo que los rangos (como un 'día completo') a menudo se representan como una medianoche a medianoche (a menudo en una zona horaria arbitraria)Finalmente, vale la pena señalar que los segundos intercalares generalmente se corrigen a sí mismos contra un buen reloj del sistema que se actualiza con ntp en una hora (vea los enlaces a continuación). La posibilidad de que un sistema esté todavía en funcionamiento en la introducción de dos segundos intercalares (cada seis meses como mínimo, prácticamente cada pocos años) es bastante improbable, especialmente si se considera el hecho de que debe volver a implementar nuevas versiones de su código de vez en cuando. . Incluso el uso de un lenguaje dinámico que regenera clases o algo así como un motor WAR contaminará el espacio de clases y eventualmente se quedará sin permgen.
fuente
JSR 310 , que reemplazó a las antiguas clases de fecha y hora con java.time en Java 8, se justifica en el JSR original de la siguiente manera:
fuente
getMonth()
está basado en cero,getYear()
está basado en 1900 (es decir, el año 2009 se representa como 109).Date
clase.fuente
Lo siento por usted ... como ex programador de .NET, hice las mismas preguntas, la API de tiempo en .NET (intervalos de tiempo, sobrecarga del operador) es muy conveniente.
Primero, para crear una fecha específica, usa una API obsoleta o:
Para restar un día haces cosas malas como
o peor
Para saber cuánto tiempo pasó entre dos fechas (en días / semanas / meses) ... se pone aún peor
Sin embargo, DateUtils de apache (
org.apache.commons.lang.time.DateUtils
) ofrece algunos métodos convenientes y me encontré usándolos solo últimamenteComo escribió Brabster, Joda Time también es una buena biblioteca externa, pero apache parece más "común" que cualquier otra cosa ...
fuente
Period
yDuration
classes para calcular y representar el tiempo transcurrido en una escala de años-meses-días y horas-minutos-segundos respectivamente.Para ser honesto, encuentro la API de fecha de Java utilizable. La mayor parte de los problemas que he visto y oído acerca relacionan con el nivel de detalle, la necesidad de involucrar a múltiples clases a hacer nada útil (
Calendar
,Date
,DateFormat
/SimpleDateFormat
) y la falta de métodos de acceso simples comogetDayOfWeek()
.Joda Time es una API alternativa muy respetada en Java, y en la sección Por qué Joda Time ofrece algunos argumentos más sobre por qué es una alternativa viable que podría ser de interés.
fuente