tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Детали
У меня есть java.util.Date в формате гггг-мм-дд
Как уже упоминалось, у Date
класса нет формата. Он отсчитывает миллисекунды с начала 1970 года по всемирному координированному времени. Безвоздмездно.
java.time
В других ответах используются старые устаревшие классы даты и времени, которые теперь вытесняются классами java.time.
Если у вас есть java.util.Date
, преобразовать в Instant
объект. Instant
Класс представляет собой момент на временной шкале в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = myUtilDate.toInstant();
Часовой пояс
Другие ответы игнорируют ключевой вопрос о часовом поясе. Для определения даты требуется часовой пояс. В любой момент дата меняется в зависимости от зоны земного шара. Через несколько минут после полуночи в Париже Франция - новый день, в то время как в Монреале Квебек все еще «вчера».
Определите часовой пояс, в котором вам нужен контекст для вашего Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Примените, ZoneId
чтобы получить ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
Если вас интересует только дата без времени суток, извлеките LocalDate
.
LocalDate localDate = zdt.toLocalDate();
Чтобы сгенерировать строку в стандартном формате ISO 8601, YYYY-MM-DD, просто вызовите toString
. Классы java.time по умолчанию используют стандартные форматы при генерации / анализе строк.
String output = localDate.toString();
2017-01-23
Если вам нужен формат ММ-ДД-ГГГГ, определите шаблон форматирования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
Обратите внимание, что коды шаблонов форматирования чувствительны к регистру. Код в вопросе используется неправильно mm
(минута часа), а не MM
(месяц года).
Используйте тот же DateTimeFormatter
объект для разбора. Классы java.time являются потокобезопасными, поэтому вы можете сохранить этот объект и многократно использовать его даже в разных потоках.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, иSimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Где взять классы java.time?
- Java SE 8 и SE 9 и новее
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- В Java 9 добавлены некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .