Java DateFormat e SimpleDateFormat retornando uma data que está incorreta
-
19-09-2019 - |
Pergunta
Hoje é terça -feira, 9 de fevereiro de 2010 e quando imprimir a data em que recebo a data errada:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date today = formatter.parse(String.format("%04d-%02d-%02d",
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH)));
System.out.println("Today is " + today.toString());
A linha de impressão resulta: "Hoje está sábado 09 00:00:00 CST 2010"
Certamente não é sábado, 09 de janeiro, é terça -feira 09 de fevereiro. Estou assumindo que estou fazendo algo errado, então alguém pode me informar o que há de errado aqui? Eu tenho que definir manualmente o dia da semana?
Atualizar
Nota: Eu não quero inicializar hoje com new Date()
Porque eu quero as horas, minutos, segundos e milissegundos inicializados para 0
. Isso é necessário para que eu possa comparar uma data de entrada do usuário hoje: se o usuário inserir a data de hoje e eu uso o formatador para construir um objeto de data, se eu inicializar hoje com new Date()
e eu comparo as duas datas- hoje será depois a data selecionada pelo usuário (que está incorreta). Assim, preciso inicializar hoje no início do dia sem o HR/min/s/ms.
Solução
Confusamente, os meses do calendário contam de 0 (janeiro) a 11 (dezembro), para que você esteja passando "2010-01-09" para formatter.parse () quando extrair o campo do mês do calendário.
Há uma discussão sobre isso em um relacionado Então pergunta.
Outras dicas
Se você não quiser usar o Jodatime, pode usar:
Calendar calendar = Calendar.getInstance();
calendar.set( Calendar.HOUR_OF_DAY, 0 );
calendar.set( Calendar.MINUTE, 0 );
calendar.set( Calendar.SECOND, 0 );
calendar.set( Calendar.MILLISECOND, 0 );
Date today = calendar.getTime();
Isso é muito mais eficiente e menos propenso a erros do que sua abordagem de formatação/análise de sequência.
Se você pode usar o Jodatime, este é um método muito preferido:
LocalDate date = new DateTime().toLocaleDate();