2011-02-08 9 views
45

Según doc, conjunto calendario() es:¿Por qué el calendario de Java establecido (int year, int month, int date) no devuelve la fecha correcta?

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#set%28int,%20int,%20int%29

set(int year, int month, int date) 
Sets the values for the calendar fields YEAR, MONTH, and DAY_OF_MONTH. 

código:

Calendar c1 = GregorianCalendar.getInstance(); 
c1.set(2000, 1, 30); //January 30th 2000 
Date sDate = c1.getTime(); 

System.out.println(sDate); 

salida:

Wed Mar 01 19:32:21 JST 2000 

¿Por qué no es Jan 30 ???

+8

sugerencia estándar para cualquier persona usando '' java.util.Date' o java.util.Calendar': utilizar Joda Time, disponible en http://joda-time.sourceforge.net/ – mdrg

+7

meses se cuentan desde 0 , no 1. Sí, lo sé - es molesto. –

+0

Comenzaré a utilizar Jode para cada posible proyecto a partir de ahora, la cantidad de incoherencia y rareza con fecha y calendario es demasiado alta. – Warpzit

Respuesta

90

1 para el mes es febrero. El 30 de febrero se cambia al 1 de marzo. Debe establecer 0 por mes. Lo mejor es usar la constante definida en el Calendario:

c1.set(2000, Calendar.JANUARY, 30); 
+0

¡Gracias! ¡deseo que el doc de Java insista en un punto tan importante! (¿O me perdí eso ...?) –

+1

@ masato-san: Te lo perdiste, http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html#set%28int,% 20int,% 20int% 29. –

17

meses en objeto Calendar empiezan desde 0

0 = January = Calendar.JANUARY 
1 = february = Calendar.FEBRUARY 
+0

tío que salvó el día – Qasim

6

La fecha seleccionada en el ejemplo es interesante. Ejemplo bloque de código es:

Calendar c1 = GregorianCalendar.getInstance(); 
c1.set(2000, 1, 30); //January 30th 2000 
Date sDate = c1.getTime(); 

System.out.println(sDate); 

y salida Wed Mar 01 19:32:21 JST 2000.

Cuando leí por primera vez el ejemplo que creo que la salida está mal pero es cierto :)

  • Calendar.Month es a partir de 0, por lo que 1 significa febrero.
  • El último día de febrero es 28, por lo que la salida debería ser el 2 de marzo.
  • Pero el año seleccionado es importante, es 2000, lo que significa el 29 de febrero, por lo que el resultado debería ser el 1 de marzo.
Cuestiones relacionadas