Creación de un objeto de fecha de Java a partir de año, mes, día

95
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

La salida es:

1988
Miércoles 25 de enero 00:00:08 IST 1989

Estoy pasando 25 12 1988pero lo consigo 25 Jan 1989. ¿Por qué?

JAVAGeek
fuente
1
¿Qué es b en el código?
MysteryGuy

Respuestas:

109

Los meses se basan en cero en Calendario. Entonces 12 se interpreta como diciembre + 1 mes. Utilizar

c.set(year, month - 1, day, 0, 0);  
JB Nizet
fuente
5
Diseñadores de API de IBM, diseñadores de API de JavaScript. Aparte de eso, probablemente nadie. Tenga en cuenta que Calendar ahora está obsoleto por la API java.time de Java 8, que hace lo correcto.
JB Nizet
64

Esa es mi forma favorita antes de Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Yo diría que este es un enfoque más limpio que:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
fuente
4
El mes podría especificarse utilizando Calendarconstantes, por ejemplo. Calendar.FEBRUARY.
Geekarist
1
Tenga cuidado, los meses solían numerarse desde cero en Java 7. Utilice constantes para evitar problemas.
jediz
25

java.time

Usando el java.timemarco integrado en Java 8

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Si también necesita información sobre el tiempo (hora, minuto, segundo) utilice alguna conversión de LocalDateaLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
fuente
Buena respuesta, pero especifique una zona horaria si la conoce. A LocalDateno tiene zona horaria y, por lo tanto, no representa un momento exacto en la línea de tiempo. Si su contexto indica una zona horaria, aplíquelo para obtener un ZonedDateTimeobjeto: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque
8

La representación del Calendario de Java no es la mejor, están trabajando en ella para Java 8. Le aconsejaría que use Joda Time u otra biblioteca similar.

Aquí hay un ejemplo rápido usando LocalDate de la biblioteca Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Aquí puede seguir un tutorial de inicio rápido.

Fdiazreal
fuente
6

Ver JavaDoc :

mes: el valor utilizado para configurar el campo de calendario MES. El valor del mes se basa en 0. por ejemplo, 0 para enero.

Entonces, el mes que establezca es el primer mes del próximo año.

zw324
fuente
0

Facilite su vida al trabajar con fechas, marcas de tiempo y duraciones. Utilice HalDateTime desde

http://sourceforge.net/projects/haldatetime/?source=directory

Por ejemplo, puede usarlo para analizar su entrada de esta manera:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

También puede especificar patrones para analizar e imprimir.

Hajo Lemcke
fuente
3
¿Parece que estás promocionando tu propia clase de biblioteca? Probablemente esté permitido, pero se vería mejor si mencionara si es un desarrollador principal de HalDateTime.
Ole VV
No voté en contra. Sin embargo, la vida nunca es fácil con las citas. Tu biblioteca no cambiará ese hecho.
kiltek
¿Por qué votar en contra? Mi biblioteca data de 2013. Toda la funcionalidad está disponible en java.time como se especifica en JSR 310, que personalmente considero que es una de las API mejor diseñadas. Recomiendo totalmente usar ese.
Hajo Lemcke