Формат даты YYYY возвращает 2021 год на одном устройстве и 2020 год на другом устройстве

Я пытаюсь отформатировать дату, используя приведенный ниже код.

2021-01-02 возвращает ЯНВАРЬ 2020 г. на одном устройстве и ЯНВАРЬ 2021 г. на другом устройстве. Почему так?

formatDate(transactionItem.dateLabel, "yyyy-MM-dd", "MMMM YYYY")?.toUpperCase()


public static String formatDate(String inputDate, String inputFormat, String outputFormat) {
        try {
            Locale appLocale = new Locale(LocaleHelper.getDefaultLanguage());
            DateFormat originalFormat = new SimpleDateFormat(inputFormat, appLocale);
            DateFormat targetFormat = new SimpleDateFormat(outputFormat);
            Date dateObject = originalFormat.parse(inputDate);
            String formattedDate = targetFormat.format(dateObject);
            return formattedDate;
        } catch (ParseException var9) {
            return "";
        } catch (Exception var10) {
            return "";
        }
    }

person Ankush Kapoor    schedule 02.01.2021    source источник
comment
какие локали установлены на устройствах?   -  person Stachu    schedule 02.01.2021
comment
@Stachu appLocale возвращает en для обоих устройств   -  person Ankush Kapoor    schedule 02.01.2021
comment
ГГГГ - это год недели, который отличается от календарного года (см. неделя год действительно работает"> stackoverflow.com/questions/34691582/). Я не знаю, почему он отличается для двух устройств, но возможными причинами являются разные локали (что приводит к использованию разных календарей) или уровень API Android (год недели YYYY вводится в API 24 в соответствии с developer.android.com/reference/java/text/SimpleDateFormat)   -  person maurice    schedule 02.01.2021
comment
Отвечает ли это на ваш вопрос? Как на самом деле работает год недели Java?   -  person Ole V.V.    schedule 07.01.2021
comment
Отвечает ли это на ваш вопрос? Y возвращает 2012, а y возвращает 2011 в формате SimpleDateFormat   -  person Ole V.V.    schedule 07.01.2021
comment
В качестве отступления подумайте о том, чтобы выбросить давно устаревшие и заведомо неприятные SimpleDateFormat и их друзей. Посмотрите, можете ли вы использовать дешугаринг или добавить ThreeTenABP в свой проект Android, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.   -  person Ole V.V.    schedule 07.01.2021


Ответы (1)


В вашем коде есть две основные и связанные проблемы:

  1. Использование SimpleDateFormat без Locale: вы использовали new SimpleDateFormat(outputFormat) без Locale, поэтому это подвержено ошибкам. Проверьте этот ответ, чтобы узнать больше о проблеме, которая может возникнуть из-за отсутствия Locale. Поскольку ваш ожидаемый вывод на английском языке, используйте английский тип Locale, например. new SimpleDateFormat(outputFormat, Locale.ENGLISH).
  2. Y используется для года недели и для SimpleDateFormat, он чувствителен к локали, т. е. может иметь разные значения для разных локалей. Проверьте это обсуждение, чтобы узнать больше об этом. Судя по вашему вопросу, вы имеете в виду Year, а не Week year, и поэтому вы должны использовать y, как уже указано в вашем inputFormat.

API даты и времени java.util и их API форматирования SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени.

Узнайте о современном API даты и времени из Trail: Date Time.

person Arvind Kumar Avinash    schedule 06.01.2021