Código anterior:
public static void main(String[] args) throws Exception{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
Calendar calendar = Calendar.getInstance();
calendar.setTime(simpleDateFormat.parse("2021-08"));
calendar.roll(Calendar.MONTH, -5);
String date = simpleDateFormat.format(calendar.getTime());
System.out.println("-------------" + date + "-------------");
}
resultado de la operación
-------------2021-03-------------
Se puede observar que la fecha que se obtiene restando 5 meses no es problema, pero sí hay problema al restar más de un año, y luego intentar restar 20 meses.
public static void main(String[] args) throws Exception{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
Calendar calendar = Calendar.getInstance();
calendar.setTime(simpleDateFormat.parse("2021-08"));
calendar.roll(Calendar.MONTH, -20);
String date = simpleDateFormat.format(calendar.getTime());
System.out.println("-------------" + date + "-------------");
}
resultado de la operación
-------------2021-12-------------
La fecha es incorrecta, la fecha correcta debería ser: 2019-12
Solución: reemplace el método roll con add, el método roll solo se puede calcular en el año actual y el método add se puede calcular entre años
public static void main(String[] args) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
Calendar calendar = Calendar.getInstance();
calendar.setTime(simpleDateFormat.parse("2021-08"));
calendar.add(Calendar.MONTH, -20);
String date = simpleDateFormat.format(calendar.getTime());
System.out.println("-------------" + date + "-------------");
}
resultado de la operación
-------------2019-12-------------