Что случилось с Java Date & Time API? [закрытый]

Очень часто я сталкиваюсь с отрицательным отзывом на Java Date и другие date-time-related классы. Будучи разработчиком.NET, я не могу полностью (не используя их), понимают, что является на самом деле неправильным с ними.

Кто-либо может пролить некоторый свет на это?

99
задан Piper Barrett 7 November 2018 в 18:35
поделиться

5 ответов

А, класс Java Дата . Возможно, один из лучших примеров того, как не делать что-то ни на одном языке, нигде и нигде. С чего начать?

Читая JavaDoc, можно подумать, что у разработчиков на самом деле есть хорошие идеи. Разница между UTC и GMT длинная, несмотря на то, что разница между ними в основном високосные секунды (что случается довольно редко ).

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

  • Несмотря на то, что он был разработан в последнее десятилетие тысячелетия, с 1900 г. он ранжирует годы как две цифры. В результате этого банального решения в мире Java буквально миллионы обходных путей делают 1900+ (или 1900-).
  • Месяцы проиндексированы нулевым значением, для того, чтобы удовлетворить зрелищный необычный случай наличия массива месяцев и не жить с массивом из тринадцати элементов, первый из которых содержит ноль. В результате мы имеем 0...11 (а сегодня это 11 месяц 109 года). Для преобразования в строку существует аналогичное число ++ и -- по месяцам.
  • Они mutable. В результате, в любой момент, когда вы хотите вернуть дату (скажем, как структуру экземпляра), вам нужно вернуть клон этой даты вместо самого объекта даты (так как в противном случае, люди могут мутировать вашу структуру).
  • Календарь Календарь, предназначенный для "исправления" этого, на самом деле делает те же самые ошибки. Они все еще мутируемы.
  • Date представляет собой DateTime, но для того, чтобы уступать тем, что есть в SQL стране, есть еще один подкласс java.sql.Date, который представляет собой один день (хотя и без связанного с ним часового пояса).
  • Нет TimeZones, связанных с Date, и поэтому диапазоны (такие как "целый день") часто представляются как полночь-полночь (часто в каком-то произвольном часовом поясе)

Наконец, стоит отметить, что високосные секунды обычно корректируются по отношению к хорошим системным часам, которые обновляются с помощью ntp в течение часа (см. ссылки ниже). Вероятность того, что система все еще будет работать при введении двух прыжковых секунд (минимум раз в полгода, практически раз в несколько лет), довольно маловероятна, особенно учитывая тот факт, что время от времени приходится переделывать новые версии кода. Даже использование динамического языка, который регенерирует классы или что-то вроде движка WAR, в конечном итоге загрязнит пространство классов и закончится пермгеном.

138
ответ дан 24 November 2019 в 05:00
поделиться
  • Случаи даты являются mutable, что почти всегда неудобно.
  • Они имеют двойную природу. Они представляют собой как метку времени, так и дату календаря. Получается, что это проблематично при вычислениях по датам.
  • Числовые представления календарных данных во многих случаях контринтуитивно понятны. Например: getMonth() равен нулю, getYear() равен 1900 году (т.е, 2009 год представлен в виде 109)
  • .Date.
28
ответ дан 24 November 2019 в 05:00
поделиться

Чувствую себя... как бывший .NET-программист, я задавал те же самые вопросы, API времени в .NET (временные интервалы, перегрузка операторов) очень удобно использовать.

Во-первых, для создания определенной даты вы используете либо устаревший API, либо:

Calendar c = Calendar.getInstance();
c.set(2000, 31, 12)

Для вычитания дня вы делаете злобные вещи вроде

Date firstDate = ...
Calendar c = Calendar.getInstance();
c.setTime(fistDate);
c.add(Calendar.DATE,-1);
Date dayAgo = c.getTime();

или еще хуже

Date d = new Date();
Date d2 = new Date(d.getTime() - 1000*60*60*24);

Чтобы узнать, сколько времени прошло между двумя датами (в днях/неделях/месяцах). ...становится ещё хуже

Однако DateUtils из apache (org.apache.commons.lang.time.DateUtils) предлагают несколько удобных методов, и в последнее время я обнаружил, что использую только их

Как писал Брэбстер, Joda Time также является хорошей внешней библиотекой, но apache кажется более "обычным", чем что-либо другое...

.
13
ответ дан 24 November 2019 в 05:00
поделиться

Честно говоря, я нахожу Java's Date API удобным в использовании. Большинство вопросов, о которых я видел и слышал, связаны с глаголикостью, необходимостью использования нескольких классов для выполнения чего-либо полезного ( Calendar, Date, DateFormat/SimpleDateFormat) и отсутствием таких простых аксессоров, как getDayOfWeek().

Joda Time является уважаемым альтернативным API на Java, а в разделе Why Joda Time он дает еще несколько аргументов о том, почему он является жизнеспособной альтернативой, которая может быть интересна.

.
4
ответ дан 24 November 2019 в 05:00
поделиться

JSR 310, который заменил старые классы дата-время на java.time на Java 8, оправдывает себя в оригинальном JSR следующим образом:

2.5 Какие потребности Java-сообщества будут удовлетворяться предлагаемыми спецификации?

В настоящее время Java SE имеет два отдельных API даты и времени - java.util.Date и java.util. Календарь. Оба API постоянно называемый труднодоступным использование Java-разработчиками в блогах и Форумы. Примечательно, что оба используют ноль-индекс. в течение нескольких месяцев, что является причиной многих жуки. Календарь также пострадал от многие ошибки и проблемы с производительностью годы, в первую очередь за счёт хранения его состояние двумя разными способами внутри.

Одна классическая ошибка (4639407) предотвратила некоторые даты создания в Объект календаря. Последовательность кода можно было бы написать, что могло бы создать датировать в одни годы, но не в другие, имеющий эффект предотвращения некоторых пользователи не вводят свой правильный даты рождения. Это было вызвано Класс "Календарь" разрешает только переход на летнее время на один час летом, когда исторически это было плюс 2 часа примерно за вторая мировая война. Пока этот баг теперь исправлена, если в какой-то момент будущее, которое выбрала страна, чтобы представить переход на летнее время плюс три часа летом, потом Класс календаря снова будет сломан.

Текущий Java SE API также страдает. в многопоточной среде. Известно, что непреложные классы изначально нитевидный, как их состояние не может измениться. Однако, как Дата, так и Календарь изменяется, что требует программистам рассмотреть возможность клонирования и в прямом смысле этого слова. Кроме того, отсутствие резьбовой безопасности Формат DateTimeFormat малоизвестен, и была причиной многих трудных отслеживает проблемы с потоками.

а также проблемы с классы, которые есть у Java SE для свиданий, у него нет классов для моделирования других концепции. Не относящиеся к временным зонам даты или времена, сроки, периоды и классовые интервалы не представлены на Java SE. В результате разработчики часто использовать намерения для представления продолжительность времени, с явадоком с указанием единицы измерения.

Отсутствие полной даты и временная модель также приводит ко многим общим операции сложнее, чем они должно быть. Например, вычисление количество дней между двумя датами особенно трудная проблема настоящее время

В этом СПС будет решена проблема полная модель даты и времени, включая даты и время (с указанием и без часовых поясов), продолжительности и временные отрезки, интервалы, форматирование и синтаксический анализ.

41
ответ дан 24 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: