Criação de objeto de data java de ano, mês, dia

94
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());  

O resultado é:

1988
Quarta, 25 de janeiro 00:00:08 IST 1989

Estou passando, 25 12 1988mas entendo 25 Jan 1989. Por quê?

JAVAGeek
fonte
1
O que é b no código?
MysteryGuy de

Respostas:

109

Os meses são baseados em zero no Calendário. Portanto, 12 é interpretado como dezembro + 1 mês. Usar

c.set(year, month - 1, day, 0, 0);  
JB Nizet
fonte
5
Designers de API da IBM, designers de API de JavaScript. Fora isso, provavelmente ninguém. Observe que o Calendário agora está obsoleto com a API Java 8 java.time, que faz a coisa certa.
JB Nizet
62

Essa é minha maneira favorita antes do Java 8:

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

Eu diria que esta é uma abordagem mais limpa do que:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
fonte
4
O mês pode ser especificado usando Calendarconstantes, por exemplo. Calendar.FEBRUARY.
Geekarist
1
Cuidado, os meses costumavam ser numerados de zero no Java 7. Use constantes para evitar problemas.
jediz
25

java.time

Usando a java.timeestrutura integrada em 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

Se você também precisar de informações sobre o tempo (hora, minuto, segundo), use alguma conversão de LocalDateparaLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
fonte
Boa resposta, mas especifique um fuso horário, se conhecido. A LocalDatenão tem fuso horário e, portanto, não representa um momento exato na linha do tempo. Se o seu contexto indicar um fuso horário, aplique-o para obter um ZonedDateTimeobjeto: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque
8

A representação do calendário do Java não é das melhores, eles estão trabalhando nisso para o Java 8. Aconselho você a usar o Joda Time ou outra biblioteca semelhante.

Aqui está um exemplo rápido usando LocalDate da biblioteca Joda Time:

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

Aqui você pode seguir um tutorial de início rápido.

Fdiazreal
fonte
6

Veja JavaDoc :

mês - o valor usado para definir o campo do calendário MÊS. O valor do mês é baseado em 0. por exemplo, 0 para janeiro.

Portanto, o mês que você definir é o primeiro mês do próximo ano.

zw324
fonte
0

Facilite sua vida ao trabalhar com datas, carimbos de data / hora e durações. Use HalDateTime de

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

Por exemplo, você pode apenas usá-lo para analisar sua entrada assim:

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

Você também pode especificar padrões para análise e impressão.

Hajo Lemcke
fonte
3
Parece que você está promovendo sua própria aula de biblioteca? Isso provavelmente é permitido, mas ficaria melhor se você mencionasse se você é um desenvolvedor principal do HalDateTime.
Ole VV
Eu não fiz downvote. No entanto, a vida nunca é fácil com datas. Sua biblioteca não mudará esse fato.
kiltek
Por que votar negativamente? Minha biblioteca data de 2013. Todas as funcionalidades estão disponíveis em java.time, conforme especificado em JSR 310, que pessoalmente considero uma das APIs mais bem projetadas. Eu recomendo totalmente usar esse.
Hajo Lemcke