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