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ê?


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

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

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

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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.