Vengo del mundo de C #, así que todavía no tengo mucha experiencia con Java. Eclipse me dijo que Date
estaba en desuso:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
¿Por qué? ¿Y qué (especialmente en casos como los anteriores) debería usarse en su lugar?
java
date
deprecated
Svish
fuente
fuente
Respuestas:
El
Date
constructor específico está en desuso, yCalendar
debería usarse en su lugar. La FechaJavaDoc
for describe qué constructores están en desuso y cómo reemplazarlos con a .Calendar
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .La
java.util.Date
clase en realidad no está en desuso, solo ese constructor, junto con un par de otros constructores / métodos están en desuso. Fue obsoleto porque ese tipo de uso no funciona bien con la internacionalización. LaCalendar
clase debería usarse en su lugar:Echa un vistazo a la fecha Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
fuente
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
clases son la mejor opción ... si está cambiando su código.tl; dr
…o…
Detalles
Las
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
las clases se precipitó demasiado rápido cuando se lanzó por primera vez en Java y evolucionó. Las clases no fueron bien diseñadas o implementadas. Se intentaron mejoras, por lo tanto, las desvalorizaciones que ha encontrado. Lamentablemente, los intentos de mejora fracasaron en gran medida. Debes evitar estas clases por completo. Se suplantan en Java 8 por nuevas clases.Problemas en tu código
Un java.util.Date tiene una porción de fecha y hora. Ignoraste la porción de tiempo en tu código. Por lo tanto, la clase Fecha tomará el comienzo del día según lo definido por la zona horaria predeterminada de su JVM y aplicará esa hora al objeto Fecha. Por lo tanto, los resultados de su código variarán según la máquina que ejecute o la zona horaria establecida. Probablemente no sea 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
Date
objeto. Es posible que desee almacenar solo una cadena de la fecha, en formato ISO 8601 deYYYY-MM-DD
. O use unLocalDate
objeto de Joda-Time (ver más abajo).Joda-Time
Lo primero que debe aprender en Java: evite las clases java.util.Date y java.util.Calendar notoriamente problemáticas incluidas en Java.
Como se señaló correctamente en la respuesta del usuario3277382 , use Joda-Time o el nuevo paquete java.time. * En Java 8.
Código de ejemplo en Joda-Time 2.3
Volcado a la consola ...
Cuando corres ...
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 de Objetos inmutables , creamos nuevas fechas y horas basadas en el mismo instante del objeto antiguo (recuento de nanosegundos desde la época ) pero con otra zona horaria asignada. Por último, obtenemos unaLocalDate
que no tiene hora del día ni zona horaria, aunque tenga en cuenta que la zona horaria se aplica al determinar esa fecha (un nuevo día amanece antes en Oslo que en Nueva York, por ejemplo).Sobre java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.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 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
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 .fuente
Una razón por la que el constructor está en desuso es que el significado del parámetro año no es el que cabría esperar. El javadoc dice:
Tenga en cuenta que el campo año es la cantidad de años transcurridos desde entonces
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
Date
API solo admite el calendario occidental moderno, tiene componentes especificados idiosincráticamente y se comporta de manera inconsistente si establece campos.Las API
Calendar
y lasGregorianCalendar
API son mejores queDate
, y las API de Joda-time de terceros generalmente se consideraron las mejores. En Java 8, introdujeron losjava.time
paquetes, y ahora son la alternativa recomendada.fuente
Encontré esta pregunta como un duplicado de una pregunta más nueva que preguntaba cuál era la forma no obsoleta de obtener un
Date
año, mes y día específicos.Las respuestas aquí hasta ahora dicen usar la
Calendar
clase, y eso fue cierto hasta que salió Java 8. Pero a partir de Java 8, la forma estándar de hacerlo es:Y luego, si realmente necesita un
java.util.Date
, puede utilizar las sugerencias de esta pregunta .Para obtener más información, consulte la API o los tutoriales para Java 8.
fuente
Tenga en cuenta que
Calendar.getTime()
no es determinista en el sentido de que la parte del día se ajusta de manera predeterminada a la hora actual.Para reproducir, intente ejecutar el siguiente código un par de veces:
Salida ej .:
Ejecutar exactamente el mismo código un par de minutos después produce:
Entonces, mientras
set()
obliga a los campos correspondientes a corregir los valores, pierde el tiempo del sistema para los otros campos. (Probado anteriormente con Sun jdk6 y jdk7)fuente
Date
en sí no está en desuso. Es solo que muchos de sus métodos lo son. Ver aquí para más detalles .Usar en su
java.util.Calendar
lugar.fuente
La mayoría de los desarrolladores de Java utilizan actualmente el paquete de terceros Joda-Time . Es ampliamente considerado como una implementación mucho mejor.
Sin embargo, Java 8 tendrá un nuevo paquete java.time. * . Consulte este artículo, Presentación de la nueva API de fecha y hora para JDK 8 .
fuente
Como el constructor Date está en desuso, puede probar este código.
fuente
Date
yCalendar
en 2019 es un mal consejo.Similar a lo que sugirió binnyb, podría considerar usar el nuevo método Calendario> GregorianCalendar. Vea estos documentos más recientes:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
fuente
Puedes hacer un método como
new Date(year,month,date)
en tu código usandoCalendar
class.Funcionará igual que el constructor obsoleto de
Date
fuente
Instant
yZonedDateTime
.El constructor Fecha espera años en el formato de años desde 1900, meses basados en cero, días basados en uno y establece las horas / minutos / segundos / milisegundos en cero.
Entonces, usando el reemplazo del Calendario (años basados en cero, meses basados en cero, días basados en uno) para el constructor de Fecha obsoleto, necesitamos algo como:
O usando Java 1.8 (que tiene un año basado en cero y meses y días basados en uno):
Aquí hay versiones iguales de Date, Calendar y Java 1.8:
fuente
(la forma anterior a Java-8)
fuente