import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
	public static void main(String[] args) throws ParseException {
		// Test
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
		sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
		
		System.out.println(monthsBetween(sdf.parse("2012-01-28"), sdf.parse("2012-02-01")));
		System.out.println(monthsBetween(sdf.parse("2012-02-27"), sdf.parse("2012-02-28")));
		System.out.println(monthsBetween(sdf.parse("2012-03-28"), sdf.parse("2012-07-01")));
	}

	static int monthsBetween(final Date fromDate, final Date toDate) {
		ZonedDateTime zdtFrom = fromDate.toInstant().atZone(ZoneOffset.UTC);
		ZonedDateTime zdtTo = toDate.toInstant().atZone(ZoneOffset.UTC);
		
		return Math.toIntExact(
					ChronoUnit.MONTHS.between(
							zdtFrom.with(TemporalAdjusters.firstDayOfMonth()),
							zdtTo.with(TemporalAdjusters.firstDayOfMonth())
					)
				);
	}
}