java .time и ThreeTenABP
Позвольте мне предложить вам использовать java .time, современный Java API даты и времени, для вашей работы с датами.
YearMonth currentMonth = YearMonth.of(2020, Month.APRIL);
YearMonth backThen = currentMonth.minusYears(1).minusMonths(2);
String formatMonth = backThen.format(DateTimeFormatter.ofPattern("MMM"));
String formatYear = backThen.format(DateTimeFormatter.ofPattern("yy"));
System.out.printf("Month %s; year %s%n", formatMonth, formatYear);
Вывод на моем компьютере (зависит от локали):
Месяц фев .; год 19
Ради воспроизводимого примера я жестко закодировал год и месяц. Чтобы начать с текущего месяца в некотором часовом поясе, используйте что-то вроде этого:
YearMonth currentMonth = YearMonth.now(ZoneId.of("Europe/Minsk"));
Что пошло не так в вашем коде?
Это плохой и запутанный дизайн Calendar
и GregorianCalendar
классов.
Вы сказали, что запускали свой код 29 апреля 2020 года. Это приводит к тому, что ваш Calendar
будет установлен на 29 февраля 2019 года. Эта дата не существует; в феврале прошлого года было всего 28 дней. Вместо этого Calendar
выбирает день после 28 февраля, то есть 1 марта. Вызывает у вас неправильный месяц.
Вопрос: java .time не требует Android API уровня 26?
java .time прекрасно работает как на старых, так и на новых Android устройствах. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях, а также на более новых Android устройствах (с уровня API 26) современный встроенный API -in.
- В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
- Вкл. (Старше) Android Используйте версию Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки