Григорианский - PullRequest
       66

Григорианский

0 голосов
/ 28 января 2019

Это должно быть довольно просто

customerSearch.get("DateOfBirth"), где customerSearch - это HashMap<String, Object>, а это григорианская дата.

Но мне нужен обычный Date объект.

Я пытался

Date dateOfBirth = new Date(
        ((GregorianCalendar) customerSearch.get("DateOfBirth")).getTimeInMillis());

, но сказал, что григорианская дата не может быть приведена к дате.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 28 января 2019

Нет класса Java GregorianDate.Если только это не ваш собственный класс, о котором вы не упомянули.Итак, на всякий случай григорианская дата - это обычная Date, так как большая часть мира сегодня использует григорианский календарь?Итак, экземпляры какого класса ваша карта содержит в вашем HashMap<String, Object>?Если это обычный Date, тогда ваш код должен быть просто:

Date dateOfBirth = (Date)(customerSearch.get("DateOfBirth"));
...