Устаревшие методы Date в Java?

Что на самом деле подразумевается при использовании утилит Java Date, а что-то устарело. Означает ли это, что его не рекомендуется использовать, или означает, что это запрещено?

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

Например, я пытаюсь использовать такой код, как следующий

String date = request.getParameter("date"); 
model.setDate(new Date(date));

Конечно... это высокоуровневый пример, но в этой ситуации моя модель использует тип Date, и мне нужно извлечь дату из запроса в виде строки и создать с ней дату.

Он отлично работает, как у меня, но использует устаревший метод.

EDIT - я вернулся и использовал

SimpleDateFormat formatter = new SimpleDateFormat(); 
model.setDate(formatter.parse(request.getParameter("date");



Дата указана в формате ММ/ДД/ГГГ, например 23.07.2010, но я получаю ParseException

От чего это может быть?


person TheJediCowboy    schedule 29.07.2010    source источник


Ответы (10)


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

Вы пытаетесь создать Date из String. Но в каком формате находится строка? Как его следует разобрать? Это британский или американский формат даты?

«Правильный» способ сделать это — создать экземпляр SimpleDateFormat и вызовите его метод parse(), передав вашу текстовую строку. Это гарантированно будет работать в будущем и будет более надежным сейчас.

person Andrzej Doyle    schedule 29.07.2010
comment
... или, что предпочтительнее, используйте лучший API, такой как Joda Time :) - person Jon Skeet; 29.07.2010
comment
Ну да. :-) Но предложение переписать весь существующий код для использования новых объектов Date является излишним в этой ситуации. - person Andrzej Doyle; 29.07.2010
comment
@Jon Skeet, проблема с постоянным использованием Better API заключается в том, что в конечном итоге у вас есть каталог API, и вам постоянно приходится проверять наличие новых выпусков в репозиториях. - person Buhake Sindi; 29.07.2010
comment
@The Elite Gentleman: Хотя я согласен, что у вас могут возникнуть проблемы в целом, Joda Time стабилен и поэтому намного лучше, чем существующий API, это определенно стоит сделать. Это огромный шаг вперед по сравнению с java.util.Date/Calendar. - person Jon Skeet; 29.07.2010

Многие люди упоминали, что означает «Устаревший», но я не вижу никакого объяснения, почему эти методы устарели:

Sun (до того, как они стали частью Oracle) объявила устаревшим ряд методов в Date, чтобы заставить людей использовать Calendar/GregorianCalendar для манипулирования датами.

person Powerlord    schedule 29.07.2010

Устаревшие объекты или методы просто означают, что если вы хотите использовать их в текущем проекте, скорее используйте то, что рекомендуется. Причина, по которой он все еще используется, заключается в устаревших кодах, которые использовали устаревший метод до, когда он стал устаревшим. Типичным примером является метод StringTokenizer против String.split().

В примере с датой используйте SimpleDateFormat сделать преобразование из строки в дату. Это позволяет вам создать формат даты, из которого ваша строковая дата может быть проанализирована для создания объекта Date.


Для вашего EDIT сделайте это

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 

model.setDate(formatter.parse(request.getParameter("date")));

ParseException вызвано тем, что вы не предоставили структуру формата даты, поэтому SimpleDateFormat не знал, как была структурирована ваша дата.

person Buhake Sindi    schedule 29.07.2010

Что означает "устарело"

Возможно, вы слышали термин «самоуничижительный юмор» или юмор, преуменьшающий важность говорящего. Устаревший класс или метод подобен этому. Это уже не важно. На самом деле это настолько неважно, что вам не следует больше его использовать, так как оно было вытеснено и может перестать существовать в будущем.

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

Возможность объявить класс, метод или поле-член устаревшим решает проблему. Java поддерживает два механизма устаревания: аннотацию (поддерживается, начиная с J2SE 5.0) и тег Javadoc (поддерживается, начиная с 1.1). Существующие вызовы старого API продолжают работать, но аннотация заставляет компилятор выдавать предупреждение, когда он находит ссылки на устаревшие элементы программы. Тег Javadoc и связанные с ним комментарии предостерегают пользователей от использования устаревшего элемента и сообщают им, что использовать вместо него.

http://download-llnw.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

person Jonathon Faust    schedule 29.07.2010

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

person YoK    schedule 29.07.2010

Устаревший означает, что его планируется удалить, потому что он глючит или по какой-то другой плохой причине. Лучше использовать SimpleDateFormat.parse(); для разбора ваших строк.

person Community    schedule 29.07.2010

В общем, когда Sun (Oracle, что угодно) объявляет метод Java устаревшим, это означает, что они передумали включать его, они отговаривают вас от его использования и могут удалить его в какой-то будущей версии. Конечно, скорее всего, пройдет много времени, прежде чем он будет удален, поскольку кто знает, сколько существующего кода там используется, и какой смысл ломать существующие программы только потому, что изобретатели Java думают, что теперь они лучше понимают, как это сделать. сделать что-то?

Предположительно, у них была веская причина отказаться от чего-то, поэтому вам следует выяснить, ПОЧЕМУ они говорят, что какая-то новая функция лучше.

В случае устаревших методов Date обычно это означает, что они предлагают вам теперь использовать классы Calendar или SimpleDateFormat. В вашем случае скорее второе.

person Jay    schedule 29.07.2010

устарело: то, что существует в текущей версии Java, но будет удалено из будущих версий в какой-то момент.

Для вашего редактирования вам необходимо правильно инициализировать SimpleDateFormat, чтобы он знал, какой формат входит. Для формата 22.07.1978:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

person Dean J    schedule 29.07.2010

Как уже говорилось, методы java.util.Date устарели, потому что команда Java считала, что у них есть лучшее решение в java.util.Calendar.

К сожалению, этот класс также оказался запутанным, проблемным и плохо спроектированным.

Итак, да, вам следует избегать устаревших методов из уважения к их заменам. Но теперь у этих замен (.Calendar) есть замена (java.time).

Java.время

Все старые классы даты и времени были заменены java.time, встроенная в Java 8. Новые классы вдохновлены очень успешным Joda -Time framework, задуманный как его преемник, аналогичный по концепции, но перестроенный. Определяется JSR 310. Расширено проектом ThreeTen-Extra. См. учебник.

Используйте пакет java.time.format для разбор и создание строковых представлений значений даты и времени.

String input = "07/23/2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );

Новые классы включают LocalDate для представления даты. -только значение без времени суток.

LocalDate localDate = LocalDate.parse( input , formatter );

Если вы вызываете toString для LocalDate, вы получаете строковое представление значения даты в стандарте ISO 8601. формат ГГГГ-ММ-ДД. Чтобы сгенерировать строку в других форматах, определите другой модуль форматирования. Или вызовите методы «localize», чтобы позволить java.time выполнять тяжелую работу по определению конкретного локализованного формата.

person Basil Bourque    schedule 07.12.2015

Ничто не сломается, если вы их используете... пока.

Но они вполне могут быть удалены в будущих версиях.

person PaulJWilliams    schedule 29.07.2010
comment
большинство дат, связанных с устареванием, связаны с ошибками, поэтому что-то может сломаться из-за ошибок - person ; 29.07.2010