Наткнулся сегодня (24-12-30) на преинтереснейшую ошибку.

Простенький скрипт ищет файл по дате создания в имени, и вместо вчерашнего дня (24-12-29) почему-то ищет файл за следующий год (25-12-29).

Казалось бы, мистика, всё прекрасно работало с лета, и как на зло сломалось как раз под конец года ... и кто в этом виноват?

Не будем вдаваться в подробности, кто этому виной, а посмотрим на код:

public static void main(String[] args) throws ParseException {
  String YY_pattern = "YY-MM-dd";
  String yy_pattern = "yy-MM-dd";
    
  SimpleDateFormat weekYear = new SimpleDateFormat(YY_pattern);
  SimpleDateFormat year = new SimpleDateFormat(yy_pattern);
  
  Date date = new SimpleDateFormat("yyy-MM-dd HH:mm").parse("2024-12-30 12:00");

  System.out.println("Today    :: " + date);
  System.out.println(YY_pattern + " :: " + weekYear.format(date));
  System.out.println(yy_pattern + " :: " + year.format(date));
}

И на результат его выполнения:

Today    :: Mon Dec 30 12:00:00 EET 2024
YY-MM-dd :: 25-12-30
yy-MM-dd :: 24-12-30

А всё потому что в паттерне даты был ошибочно настроен год текущей недели вместо года текущего дня:

javadoc
javadoc

С первой неделей 2025 года, коллеги!

Комментарии (19)


  1. lair
    30.12.2024 20:17

    Для вас банальная опечатка - это "преинтереснейшая ошибка"?


    1. sergpank Автор
      30.12.2024 20:17

      Конечно, закономерно поймать подобную ошибку в конце/начале года, но я всё равно нахожу это забавным.

      Да и пост имеет шутливый, предпраздничный характер. Это точно не откровение, и не открытие.


  1. randomsimplenumber
    30.12.2024 20:17

    Как то оно античеловечно выглядит. И даты в java, и реализация задачи, и тестирование этого дела. как оно с лета работало, не привлекая внимание санитаров?


    1. aleksandy
      30.12.2024 20:17

      С лета оно работало потому, что все умные, а документацию пишут для дураков.


      1. randomsimplenumber
        30.12.2024 20:17

        символ Y в аргументе для SimpleDateFormat отвечает за год, основанный на номере недели.

        Как то контринтуитивно. Не могу представить, зачем оно.


        1. sergpank Автор
          30.12.2024 20:17

          У многих менеджеров планы расписаны по неделям.
          Они даже могут не знать какое сегодня число, но всегда знают которая сейчас неделя, и когда будет делайн.

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

          Вещь очень важная в очень узких кругах.


          1. randomsimplenumber
            30.12.2024 20:17

            Номер недели в году - допустим, ок, вещь нужная в узких кругах. Но пересчитывать номер недели в год - что за диверсант это придумал? Да ещё и протащил в потроха Java.


            1. Mingun
              30.12.2024 20:17

              Ну а как вы со всем остальным миром, живущим в привычных датах, а не в номерах недель, взаимодействовать без конвертации собрались? Те же менеджеры — пусть живут в своих неделях, а рядовые исполнители работают с понедельника по пятницу и чихать им на то, какая это неделя в году.


              1. randomsimplenumber
                30.12.2024 20:17

                как я понимаю, проблема не в номере недели, а в преобразовании номера недели в номер года.


            1. bill876
              30.12.2024 20:17

              Вот вам в таблице с еженедельным отчетом нужно, чтобы сегодня было написано "2025 - неделя 1". Какой символ форматирования вы будете использовать?


  1. muxa_ru
    30.12.2024 20:17

    Каждый раз, когда я вижу год заданный ДВУМЯ цифрами, я вспоминаю рассказы о том, что "ошибка 2000" это вымысел. :)


    1. sergpank Автор
      30.12.2024 20:17

      Бывают случаи когда двух цифр для обозначения года достаточно, и переход на новое столетие пройдёт незаметно, ввиду того что твои файлы хранятся несколько месяцев.


      1. randomsimplenumber
        30.12.2024 20:17

        Через 75 лет в виртуальной машине, где крутится программа на давно забытом языке, что-то пойдёт не так.


  1. aleksandy
    30.12.2024 20:17

    Только за этот год это, наверное, четвёртая или пятая статья про разницу YYYY и yyyy в форматировании дат. Ребят, вы вообще в курсе, что люди старались, писали документацию?


  1. Olegun
    30.12.2024 20:17

    Все писатели, один я читатель...
    https://habr.com/ru/companies/pvs-studio/articles/869920/
    И, кстати, поиском ещё несколько раз находится


  1. Tom617
    30.12.2024 20:17

    Буквально вчера на проекте столкнулись с этим. Использовали YYYY вместо yyyy


  1. inzagher
    30.12.2024 20:17

    Специально проверил поиском, нет ли у меня в проектах такой мины. Так то ерунда, но напороться на это - как нечего делать. Особенно, когда работа ведется на многих языках и на всех всё примерно одинаково. Но только примерно.


  1. shadowphoenix
    30.12.2024 20:17

    Известная штука. Писали недавно:

    https://habr.com/ru/companies/pvs-studio/articles/858512/


  1. Maccimo
    30.12.2024 20:17

    Ничего удивительного, согласно производственному календарю рабочий 2024 год закончился в субботу, 28 декабря. Зачем вы нарушаете Work-Life balance и работаете на праздниках?
    Читайте JavaDoc до написания кода и будет вам счастье.