Pregunta

Hoy es martes 9 de febrero de 2010 y cuando imprimo la fecha me sale la fecha equivocada:

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

La línea de impresión da como resultado:"Hoy es sábado 9 de enero a las 00:00:00 CST de 2010"

Seguramente no es el sábado 9 de enero, sino el martes 9 de febrero.Supongo que estoy haciendo algo mal, ¿alguien puede decirme qué está mal aquí?¿Tengo que configurar manualmente el día de la semana?

Actualizar Nota:No quiero inicializar hoy con new Date() porque quiero que las horas, minutos, segundos y milisegundos se inicialicen para 0.Esto es necesario para poder comparar la fecha ingresada por el usuario con la de hoy:si el usuario ingresa la fecha de hoy y uso el formateador para construir un objeto Fecha, entonces si inicializo hoy con new Date() y comparo las dos fechas-hoy será después la fecha seleccionada por el usuario (que es incorrecta).Por lo tanto, necesito inicializar hoy al comienzo del día sin hr/min/seg/ms.

¿Fue útil?

Solución

De manera confusa, los meses del calendario cuentan desde 0 (enero) hasta 11 (diciembre), por lo que pasa "2010-01-09" a formatter.parse() cuando extrae el campo MES del Calendario.

Hay una discusión sobre esto en un artículo relacionado. Entonces pregunta.

Otros consejos

Si no desea utilizar JodaTime puede 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();

Esto es mucho más eficiente y menos propenso a errores que no sea su formato de cadenas aproximación / análisis.

Si puede utilizar JodaTime este es un método preferido mucho más:

LocalDate date = new DateTime().toLocaleDate();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top