Почему большинство методов java.util.Date устарели?

Когда вы смотрите на javadoc classа java.util.Date, большинство методов устаревают. Почему это было сделано?

    Ну, по двум причинам. Это была очень плохая реализация концепции Dates and Times, и она была заменена classом Calendar .

    Класс Calendar , хотя и улучшается, оставляет желать лучшего, поэтому для серьезной работы Date / Time каждый рекомендует Joda-Time . Java 8 предлагает новый пакет java.time. * , Вдохновленный Joda-Time, определенный JSR-310 , и предназначен для замены старых classов Date / Calendar.

    Изменить: В ответ на конкретный вопрос о том, почему реализация является бедной, есть много причин. JavaDoc суммирует его следующим образом:

    К сожалению, API для этих функций не поддавался интернационализации.

    В дополнение к этому общему дефициту (который охватывает такие вопросы, как отсутствие компонента часового пояса, а также форматирование даты, которое лучше обрабатывается в DateFormat и невозможность иметь представление, не относящееся к григорианскому календарю), есть конкретные проблемы, которые действительно навредят class Date , в том числе тот факт, что год представлен в смете 1900 года с общей эры года.

    Calendar есть свои проблемы, но даже в JDK 1.1 было очевидно, что java.util.Date не собирается его сокращать. Несмотря на то, что Calendar является аргументом в пользу худшего API JDK, он решил, что до версии 7 он попытается решить проблему.

    • Date изменена
    • Date не поддерживает часовые пояса

    Последний привел к тому, что он был заменен Calendar . И первое, в сочетании с простотой использования, приводит к замене на Joda-Time / JSR-310 ( пакет java.time. * )

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

    Оказывается, даты и календари трудны. Таким образом, они создали class Calendar, который гораздо больше думает, чтобы обрабатывать жесткие части работы с календарями.

    Они устарели методы Date и делегированы в Календарь, потому что они не хотели изменять поведение существующих методов Date и, возможно, нарушать существующие приложения.

    Вот хороший ответ прямо из Oracle: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

    Многолетняя ошибка разработчиков Java была недостаточной поддержкой для использования времени и времени для обычных разработчиков.

    Например, существующие classы (такие как java.util.Date и SimpleDateFormatter ) не являются streamобезопасными, что приводит к потенциальным проблемам параллелизма для пользователей, а не к тому, что средний разработчик будет ожидать при написании кода обработки даты.

    Некоторые из classов даты и времени также демонстрируют довольно плохой дизайн API. Например, годы в java.util.Date начинаются в 1900, месяцы начинаются с 1, а дни начинаются с 0 – не очень интуитивно.

    java.util.Date представляет мгновение на временной шкале – обертка вокруг количества миллисекунд с эпохи UNIX, но если вы вызываете toString (), результат подсказывает, что у нее есть часовой пояс, что вызывает путаницу среди Разработчики.

    Я не знаю официальную причину, почему она устарела, но насколько я могу сказать, что GregorianCalendar и Joda-Time поддерживают операции по датам, что означает, что вы можете добавить, например, день к дате и иметь свой месяц и год соответственно обновлен.

    Например, скажем, вы хотите вычислить день после текущей даты и сегодня – 31 мая; с java.util.Date , у вас просто есть getDays() +1 , который возвращает 32, и вы должны справиться с тем, что текущий месяц не имеет 32 дней; с GregorianCalendar или Joda.time, добавив, что день до 31 мая приведет к объекту, который будет показан 1 июня, скрывая сложность с вашего зрения.

    Давайте будем гением компьютера.