tl; dr
( (GregorianCalendar) customerSearch.get( "DateOfBirth" ) ) // Retrieve and cast object of legacy class `GregorianCalendar`.
.toZonedDateTime() // Convert from terrible legacy class to modern *java.time* class.
.toLocalDate() // Extract the date-only portion, omitting time-of-day and time zone.
java.time
Вы используете и, возможно, злоупотребляете ужасными классами даты и времени, которые были вытеснены несколько лет назад java.time классов, определенных JSR 310.
ZonedDateTime
заменяет GregorianCalendar
Instant
заменяет java.util.Date
LocalDate
заменяет java.sql.Date
Если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time , вы можете конвертировать туда и обратно.Вызовите новые методы преобразования, добавленные к старым классам.
GregorianCalendar gc = customerSearch… ;
ZonedDateTime zdt = gt.toZonedDateTime() ;
Если вам нужна только дата без времени дня и без часового пояса, извлеките LocalDate
.
LocalDate dateOfBirth = zdt.toLocalDate() ;
Если под Date
вы подразумевали класс java.sql.Date
, вместо него следует использовать вышеуказанную строку, используя LocalDate
.
Если под Date
вы имели в виду java.util.Date
, это было бынеправильный класс, чтобы использовать там.Этот класс представляет момент в UTC.Изменяя зонированный момент в GregorianCalendar
/ ZonedDateTime
на UTC, вы можете изменить дату.
Преобразование
Если вам нужен объект java.util.Date
для взаимодействия со старым кодомеще не обновлено для java.time , вы можете конвертировать.java.util.Date
представляет момент в UTC, поэтому нам нужен эквивалент в java.time , Instant
, также момент в UTC, но с более высоким разрешением наносекунд, а не миллисекунд.
Мы можем извлечь Instant
из нашего ZonedDateTime
, указанного выше.По сути, это просто корректировка от зонированного значения до значения UTC.Тот же момент, та же точка на временной шкале, другое время на настенных часах.
Instant instant = zdt.toInstant() ; // Extract a `Instant`, adjusting from zone to UTC.
Используйте новые методы преобразования в старом классе.
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ; // Beware of possible data-loss in the fractional second, truncating from nanos to millis.
Если вам нужно пойти в другом направлении,от унаследованного к современному.
Instant instant = myJavaUtilDate.toInstant() ;
Используйте соответствующие типы
Если вы пытаетесь представить дату рождения, это обычно делается просто с датой без времени дняи без зоны, тогда используйте LocalDate
на вашей карте.Классы GregorianCalendar
, java.util.Date
и ZonedDateTime
представляют момент, определенную точку на временной шкале.Они никогда не должны использоваться только для даты.
java.sql.Date
класс претендует на только на дату, но из-за ужасного дизайнерского решения в качестве подкласса java.util.Date
фактическидействительно имеет время суток и смещение / зону.Этот класс, как отмечалось выше, был заменен на LocalDate
.
нормальный объект Date
Нет ничего более «нормального» в java.util.Date
или java.sql.Date
, чем в любом другом классе даты и времени.
java.util.Date
представляет момент в UTC, всегда UTC, несмотря на то, что говорит вам ужасно разработанный метод toString
(ложь).Вместо этого используйте java.time.Instant
, когда вам нужен момент в UTC. java.sql.Date
предназначен для представления только даты, но, как обсуждалось, фактически содержит внутреннее время и зону / смещение.Вместо этого используйте java.time.LocalDate
, чтобы представить дату, а не момент. GregorianCalendar
представляет момент, который виден во время настенных часов, используемое людьми определенного региона (часового пояса).Вместо этого используйте ZonedDateTime
для этой цели. java.sql.Timestamp
представляет момент в UTC, но с более высоким разрешением наносекунд, а не миллисекунд.Все связанные с моментом классы в java.time используют разрешение наносекунд.Поэтому на мгновение в UTC с разрешением UTC используйте java.time.Instant
вместо Timestamp
.
Начиная с JDBC 4.2, мы можем напрямую обмениваться java.time классами с базой данных.Так что вам больше не нужно нажимать java.sql.Date
или java.sql.Timestamp
для работы с базой данных.
О java.time
* 1123Фреймворк * 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
и more .