Я из мира C #, поэтому еще не слишком разбираюсь в Java. Eclipse только что сказал мне, что Date
он устарел:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Зачем? И что (особенно в случаях как выше) должно использоваться вместо этого?
java
date
deprecated
Svish
источник
источник
Ответы:
Конкретный
Date
конструктор устарел иCalendar
должен использоваться вместо него. ПараметрJavaDoc
for Date описывает, какие конструкторы устарели и как их заменить с помощьюCalendar
.источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .java.util.Date
Класс фактически не рекомендуется, так что конструктор, наряду с несколькими другими конструкторами / методы устарели. Это устарело, потому что такое использование плохо работает с интернационализацией.Calendar
Класс следует использовать вместо этого:Посмотрите на дату Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
источник
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
версий классы являются лучшим вариантом ... если вы изменяете свой код.ТЛ; др
…или…
подробности
В
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
классы были доставлены слишком быстро , когда Java первого запуска и эволюционировал. Классы не были хорошо разработаны или реализованы. Попытки улучшения были предприняты, поэтому вы устали. К сожалению, попытки улучшения в основном не увенчались успехом. Вы должны избегать этих классов в целом. Они вытесняются в Java 8 новыми классами.Проблемы в вашем коде
Java.util.Date имеет как дату, так и часть времени. Вы проигнорировали часть времени в своем коде. Таким образом, класс Date будет принимать начало дня в соответствии с часовым поясом JVM по умолчанию и применять это время к объекту Date. Таким образом, результаты вашего кода будут зависеть от того, на каком компьютере он работает или какой часовой пояс установлен. Наверное, не то, что вы хотите.
Если вам нужна только дата, без временной части, например, для даты рождения, вы можете не использовать
Date
объект. Вы можете сохранить только строку даты в формате ISO 8601YYYY-MM-DD
. Или используйтеLocalDate
объект из Joda-Time (см. Ниже).Joda времени
Первое, чему нужно научиться на Java: избегайте печально известных классов java.util.Date & java.util.Calendar в комплекте с Java.
Как правильно отмечено в ответе user3277382 , используйте либо Joda-Time, либо новый пакет java.time. * В Java 8.
Пример кода в Joda-Time 2.3
Дамп на консоль…
Когда беги…
java.time
В этом случае код для java.time практически идентичен коду Joda-Time .
Мы получаем часовой пояс (
ZoneId
) и создаем объект даты и времени, назначенный этому часовому поясу (ZonedDateTime
). Затем, используя шаблон « Неизменяемые объекты» , мы создаем новое время-дату, основанное на том же мгновении старого объекта (количество наносекунд с начала эпохи ), но назначенном другом часовом поясе. Наконец, мы получаем a, уLocalDate
которого нет ни времени суток, ни часового пояса, хотя обратите внимание, что часовой пояс применяется при определении этой даты (например, новый день наступает раньше в Осло, чем в Нью-Йорке ).О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в
java.sql.*
классах.Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
Одна из причин, по которой конструктор устарел, заключается в том, что значение параметра year не соответствует ожидаемому. Javadoc говорит:
Обратите внимание, что поле year - это количество лет с тех пор
1900
, поэтому ваш пример кода, скорее всего, не будет делать то, что вы ожидаете. И в этом все дело.В общем,
Date
API поддерживает только современный западный календарь, имеет специфически определенные компоненты и ведет себя непоследовательно, если вы задаете поля.Calendar
ИGregorianCalendar
интерфейсы лучшеDate
, а третьи сторонние API , Joda времени , как правило , считается лучшим. В Java 8 они представилиjava.time
пакеты, и теперь они являются рекомендуемой альтернативой.источник
Я столкнулся с этим вопросом как с дубликатом нового вопроса, в котором был задан вопрос о том, каким должен быть недревесный способ получения
Date
определенного года, месяца и дня.В приведенных здесь ответах сказано, что нужно использовать этот
Calendar
класс, и это было правдой до выхода Java 8. Но на Java 8 стандартный способ сделать это:И тогда, если вам действительно это нужно
java.util.Date
, вы можете воспользоваться предложениями в этом вопросе .Для получения дополнительной информации, ознакомьтесь с API или учебными пособиями по Java 8.
источник
Обратите внимание, что
Calendar.getTime()
это недетерминировано в том смысле, что дневная часть по умолчанию принимает текущее время.Чтобы воспроизвести, попробуйте выполнить следующий код пару раз:
Выход например:
Выполнение точно такого же кода через пару минут приводит к:
Таким образом, в то время как
set()
вынуждает соответствующие поля корректировать значения, это приводит к утечке системного времени для других полей. (Проверено выше с Sun jdk6 и jdk7)источник
Date
само по себе не устарело. Это просто много его методов. Смотрите здесь для деталей .Используйте
java.util.Calendar
вместо этого.источник
Большинство разработчиков Java в настоящее время используют сторонний пакет Joda-Time . Это широко признано, чтобы быть намного лучшей реализацией.
Однако в Java 8 будет новый пакет java.time. * . Смотрите эту статью, Представляя новый API даты и времени для JDK 8 .
источник
Поскольку конструктор Date устарел, вы можете попробовать этот код.
источник
Date
иCalendar
в 2019 году плохой совет.Подобно тому, что предложил binnyb, вы можете рассмотреть возможность использования более нового метода Calendar> GregorianCalendar. Смотрите эти более свежие документы:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
источник
Вы можете создать метод, как
new Date(year,month,date)
в вашем коде, используяCalendar
класс.Это будет работать так же, как устаревший конструктор
Date
источник
Instant
иZonedDateTime
.Конструктор Date ожидает годы в формате лет с 1900 года, месяцев с нулями, дней с единицами и устанавливает часы / минуты / секунды / миллисекунды в ноль.
Таким образом, используя замену Календаря (годы с нулями, месяцы с нулями, дни с единицами) для устаревшего конструктора Date, нам нужно что-то вроде:
Или используя Java 1.8 (в котором год начинается с нуля, а месяцы и дни равны единице):
Вот равные версии Date, Calendar и Java 1.8:
источник
(путь до Java-8)
источник