# V6122. The 'Y' (week year) pattern is used for date formatting. Check whether the 'y' (year) pattern was intended instead.

Анализатор обнаружил потенциальную ошибку, связанную с использованием спецификатора 'Y' в паттерне форматирования даты. Возможно, предполагалось использовать спецификатор 'y'.

Рассмотрим пример:

    Date date = new Date("2024/12/31");
    String result = new SimpleDateFormat("dd-MM-YYYY").format(date); //31-12-2025

'Y' литерал в паттерне даты обозначает не текущий год, а год относительно текущей недели.

По стандарту ISO-8601:

- День, с которого начинается неделя — понедельник.
- Первая неделя в году обязана состоять минимум из четырёх дней этого года.

Рассмотрим фрагмент календаря на конец 2024 и начало 2025 года:

ПН | ВТ | СР | ЧТ | ПТ | СБ | ВС
--- | --- | --- | --- | --- | --- | ---
30 | 31 | 1 | 2 | 3 | 4 | 5

Приведённая неделя будет считаться первой неделей 2025 года, поскольку соответствует условиям из вышеупомянутого стандарта. Поэтому, используя литерал 'Y' вместо ожидаемого 2024 года, мы получаем 2025.

Ошибочным будет и обратный пример:

    Date date = new Date("2027/01/01");
    String result =
      new SimpleDateFormat("dd-MM-YYYY").format(date); // 01-01-2026

Рассмотрим фрагмент календаря на конец 2026 и начало 2027 года:

ПН | ВТ | СР | ЧТ | ПТ | СБ | ВС
--- | --- | --- | --- | --- | --- | ---
28 | 29 | 30 | 31 | 1 | 2 | 3

Обратите внимание: 1, 2 и 3 января будут относиться к последней неделе декабря. Эта неделя условиям вышеупомянутого стандарта не соответствует.

В случае, если вы желаете отобразить год без учёта недели года, необходимо использовать литерал 'y' в паттерне форматирования даты.

Корректный пример:

    Date date = new Date("2027/01/01");
    String result = new SimpleDateFormat("dd-MM-yyyy").format(date) // 01-01-2027