2010-04-21 11 views
27

Estoy tratando de hacer algo realmente simple, pero comenzando a darme cuenta de que las fechas en Java son un poco campo minado. Todo lo que quiero es pasar grupos de tres ints (un año, un mes y una fecha) crear algunos objetos Date, hacer una prueba simple sobre ellos (en la línea de la fecha A antes de la fecha B y después del 1 de enero de 1990), convertirlos a objetos java.sql.Date y pasarlos a la base de datos a través de JDBC.Cuál es la forma aceptada de reemplazar java.util.Date (año, mes, día)

Todo muy simple y funciona bien usando el constructor java.util.Date(int year,int month,int day). Por supuesto, ese constructor está depreciado, y me gustaría evitar el uso de llamadas depreciadas en el nuevo código que estoy escribiendo. Sin embargo, todas las demás opciones para resolver este simple problema parecen estúpidamente complicadas. ¿Realmente no hay una manera simple de hacer lo que quiero sin usar constructores depreciados?

Sé que la respuesta estándar a todas las preguntas relacionadas con la fecha de Java es "use joda time", pero realmente no quiero empezar a buscar en bibliotecas de terceros por un problema tan aparentemente trivial.

+2

traducción: "... pero realmente quiero pretender que las clases de JDK no pueden ser tan jodidas como todo el mundo dice". –

Respuesta

34

La idea es utilizar la clase Calendar, así:

Calendar cal = Calendar.getInstance(); 
cal.set(year, month, date); 
Date date = cal.getTime(); 

De hecho, si se comprueba la Javadoc de la constructor que está mencionando, es exactamente lo que se sugiere:

Date(int year, int month, int date) 
      Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date) or GregorianCalendar(year + 1900, month, date). 

O ... usa JodaTime :-).

+4

+1 JodaTime, y revisa JDK 7 siempre que eso ocurra. –

+2

Este es uno de esos problemas en el calendario: no obtendrá el mismo resultado con este código, ya que el calendario conservará su componente de tiempo utilizando este código. Tendría que usar el constructor GregorianCalendar directamente para evitar los problemas de tiempo o borrar explícitamente todos los campos de tiempo. – Yishai

4

Bueno, puede usar el constructor obsoleto. Ha estado en desuso por más de 13 años y todavía funciona: no va a ningún lado. Si no desea hacer eso y no desea usar una biblioteca de terceros, debe usar el Calendario.

En Java 7, con suerte habrá una nueva API de tiempo, y ya no tendrá la necesidad de una API de terceros.

+2

No es Java 7, pero Java 8 tiene una nueva API de tiempo: https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html –

1

La respuesta de LG es válida, pero en general debe usar Calendar para todas las operaciones de fecha y dejar Date a menos que su API lo requiera explícitamente. En ese caso, puede convertirlo al pasarlo a la API.

Cuestiones relacionadas