tl; dr
LocalDate ld =
myUtilDate.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate() ;
Избегайте устаревших классов даты и времени
Вы используете проблемные старые классы даты и времени.Избежать их.
Вместо этого используйте java.time классы.Они вытесняют старые классы, а также библиотеку Joda-Time.
Преобразование
Преобразование java.util.Date
в Instant
.
Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд .
Instant instant = myUtilDate.toInstant();
Часовой пояс
Применение часового пояса.Часовой пояс имеет решающее значение.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париже Франция - новый день, а в Монреале - Квебеке «вчера».
Примените ZoneId
, чтобы получить объект ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Local…
Типы
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.Аналогично, LocalTime
представляет время суток без даты и без часового пояса.Вы можете рассматривать их как два компонента, которые вместе с ZoneId
составляют ZonedDateTime
.Вы можете извлечь их из ZonedDateTime
.
LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();
Strings
Если ваша цель - просто генерировать Strings для представления пользователю, нет необходимости в типах Local…
.Вместо этого используйте DateTimeFormatter
для генерации строк, представляющих только часть даты или часть времени.Этот класс достаточно умен, чтобы автоматически локализовать при генерации строки.
Укажите Locale
, чтобы определить (а) человеческий язык, используемый для перевода названия дня, название месяца и тому подобное, и (б) культурные нормы для решения таких вопросов, как аббревиатура, заглавные буквы, знаки препинания и тому подобное.
Locale l = Locale.CANADA_FRENCH ; // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter fDate = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
String outputDate = zdt.format( fDate );
DateTimeFormatter fTime = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputTime = zdt.format( fTime );
О java.time
The java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date
, .Calendar
и & java.text.SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial .И найдите в Stack Overflow множество примеров и объяснений.
Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android in ThreeTenABP (см. Как использовать… ).
Проект ThreeTen-Extra расширяет Java. время с дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.