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 {
// Test
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);
ChronoUnit.MONTHS.between(
zdtFrom.with(TemporalAdjusters.firstDayOfMonth()),
zdtTo.with(TemporalAdjusters.firstDayOfMonth())
)
);
}
}
aW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwppbXBvcnQgamF2YS50aW1lLlpvbmVPZmZzZXQ7CmltcG9ydCBqYXZhLnRpbWUuWm9uZWREYXRlVGltZTsKaW1wb3J0IGphdmEudGltZS50ZW1wb3JhbC5DaHJvbm9Vbml0OwppbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLlRlbXBvcmFsQWRqdXN0ZXJzOwppbXBvcnQgamF2YS51dGlsLkRhdGU7CmltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwppbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwoKcHVibGljIGNsYXNzIE1haW4gewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKCQkvLyBUZXN0CgkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIsIExvY2FsZS5FTkdMSVNIKTsKCQlzZGYuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkV0Yy9VVEMiKSk7CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKG1vbnRoc0JldHdlZW4oc2RmLnBhcnNlKCIyMDEyLTAxLTI4IiksIHNkZi5wYXJzZSgiMjAxMi0wMi0wMSIpKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKG1vbnRoc0JldHdlZW4oc2RmLnBhcnNlKCIyMDEyLTAyLTI3IiksIHNkZi5wYXJzZSgiMjAxMi0wMi0yOCIpKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKG1vbnRoc0JldHdlZW4oc2RmLnBhcnNlKCIyMDEyLTAzLTI4IiksIHNkZi5wYXJzZSgiMjAxMi0wNy0wMSIpKSk7Cgl9CgoJc3RhdGljIGludCBtb250aHNCZXR3ZWVuKGZpbmFsIERhdGUgZnJvbURhdGUsIGZpbmFsIERhdGUgdG9EYXRlKSB7CgkJWm9uZWREYXRlVGltZSB6ZHRGcm9tID0gZnJvbURhdGUudG9JbnN0YW50KCkuYXRab25lKFpvbmVPZmZzZXQuVVRDKTsKCQlab25lZERhdGVUaW1lIHpkdFRvID0gdG9EYXRlLnRvSW5zdGFudCgpLmF0Wm9uZShab25lT2Zmc2V0LlVUQyk7CgkJCgkJcmV0dXJuIE1hdGgudG9JbnRFeGFjdCgKCQkJCQlDaHJvbm9Vbml0Lk1PTlRIUy5iZXR3ZWVuKAoJCQkJCQkJemR0RnJvbS53aXRoKFRlbXBvcmFsQWRqdXN0ZXJzLmZpcnN0RGF5T2ZNb250aCgpKSwKCQkJCQkJCXpkdFRvLndpdGgoVGVtcG9yYWxBZGp1c3RlcnMuZmlyc3REYXlPZk1vbnRoKCkpCgkJCQkJKQoJCQkJKTsKCX0KfQ==