Android календарь получить предыдущий к предыдущему месяцу предыдущего года - PullRequest
0 голосов
/ 29 апреля 2020

У меня проблема с android календарем, я хочу получить предыдущий месяц, когда я пытаюсь сделать это с текущим годом, это достигнет моей цели, но когда я пытаюсь с предыдущим годом, это не удается. в моем случае сегодня 29 апреля 2020 года, и я хочу, чтобы февраль / 2019 года вернулся из календаря. пожалуйста, помогите мне с этим.

мой код следующий

Date dt = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
int month = cal.get(Calendar.MONTH) - 2; // beware of month indexing from zero
            int year = cal.get(Calendar.YEAR)-1;
            int day = cal.get(Calendar.DAY_OF_MONTH);
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month);
            String formatMonth = new SimpleDateFormat("MMM").format(cal.getTime());
            String formatYear = new SimpleDateFormat("yy").format(cal.getTime());```  

1 Ответ

0 голосов
/ 01 мая 2020

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 с подпакетами.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...