Я использую Java 7 для разработки приложения для планирования конференций.
Я видел, что существует несколько типов данных для обработки дат.
Пример:
private Date creationDate;
private DateTime creationDate;
private Calendar creationDate;
Мой вопрос: в чем разница между type Calendar
и Date
?DateTime
Типовые объекты
Date
в Java используются для представления определенного момента времени. Он также позволяет преобразовывать и анализировать даты, однако методы, обеспечивающие это, теперь устарели .Его место занимает класс
Calendar
для арифметики и преобразования дат, этот класс также предоставляет возможность работать сLocales
датами и представлять их на разных языках или в определенных типах календарей.Преобразование объектов
Date
вCalendar
простое:Если у вас есть экземпляр,
Calendar
вы можете получить информацию о дате следующим образом:Следует иметь в виду, что месяцы считаются целыми числами от 0 до 11. В документации вы можете найти все доступные поля, с которыми вы можете ознакомиться.
Если у вас есть экземпляр
Calendar
и вы хотите преобразовать его в дату:Для разбора и форматирования дат рекомендуется использовать класс
DateFormat
или подклассSimpleDateFormat
, например, такой:Мое предложение состоит в том, что вы храните свои даты как объекты,
Date
потому что их легче создавать, и если вам нужны какие-либо преобразования или операции, такие как добавление 5 месяцев к использованию даты,Calendar
вернитесь к файлуDate
.Наконец
DateTime
, это не тип данных в Java SE, он существует как часть библиотеки Joda Time и предлагает множество дополнительных методов для работы с датами.Из документации
java.util.Date
(переведено):Пока
java.util.Calendar
(в переводе, выделено мной):Самая большая проблема здесь, в дизайне класса
Date
, заключается в том, что он изменчив, когда он должен был быть неизменным, и операции с датами, такие как увеличение (или уменьшение) дней, часов, секунд, лет и т. д., и генерацияDate
s должны быть черезCalendar
. По крайней мере, так я обычно работаю, чтобы избежать проблем с обработкой файловDate
. В Java 8 это было решено путем реализации новой внутренней структуры для обработки дат и времени под названием Java 8 Date and Time , и классы можно найти в пакетеjava.time
(ваш вопрос основан на Java 7, поэтому я упоминаю только эту часть Java 8). , я не буду углубляться в этот момент).Чтобы использовать
Calendar
, я рекомендую всегда инициализировать его следующим образом:Поскольку существует более одной реализации
Calendar
, наиболее известной (и используемой)GregorianCalendar
является , но есть такжеBuddhistCalendar
иJapaneseImperialCalendar
(по крайней мере, из кода Open JDK). МетодCalendar#getInstance
делегирует создание календаря методу,createCalendar
который для Java 8 реализован следующим образом (просмотр исходного кода HotSpot):Я всегда рекомендую работать с
Calendar
, потому что считается хорошей практикой работать с абстрактными классами и интерфейсами, когда это возможно, а не с реализацией напрямую. Это описано здесь: https://stackoverflow.com/q/383947/1065197Я не знаю ни одного класса,
DateTime
объявленного в JDK 7. Возможно, вы имеете в виду классorg.joda.time.DateTime
библиотеки Joda Time (любопытное название на испанском языке), который появился как решение, позволяющее избежать работы с темDate
фактом, что он изменчив.DateTime
является неизменяемым, и операции, которые вы выполняетеDateTime
, фактически создают новый экземплярDateTime
вместо изменения текущего экземпляра.Если вы хотите знать, какой класс вы должны использовать в своих проектах, я бы дал вам следующие рекомендации:
Date
(убедитесь, что они из пакетаjava.util
).Date
добавлению или удалению времени есть 2 варианта:Calendar
, установите его время из экземпляраDate
viaCalendar#setTime
, выполните необходимые операции и получитеDate
значениеCalendar
viaCalendar#getTime
.DateTime
де Йоды.SimpleDateFormat#format(Date)
(глаз, получитьDate
и неCalendar
) и избегать использования расширенияDate#getXyz
. Вы также можете использоватьCalendar#get(Calendar.<campo>)
, но код будет очень подробным (я не знаю перевода этого).Почему бы прямо не объявить использование
DateTime
в полях ваших сущностей? Ну, потому что есть фреймворки, которые не поддерживают прямое преобразование, если вы не реализуете для него специальные преобразователи. Некоторые примеры: Hibernate 1 , JSF, Spring и т. д.1 Hibernate 5 теперь предлагает поддержку библиотеки даты и времени Java 8. Я предполагаю, что в какой-то момент фреймворки тоже постепенно пойдут по этому пути.