Короткий ответ
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Объяснение
Несмотря на свое имя, java.util.Date
представляет собой мгновение на линии времени, а не «дату». Фактические данные, хранящиеся в объекте, - это long
счет миллисекунд с 1970-01-01T00: 00Z (полночь в начале 1970 г. / UTC).
Эквивалентный класс для java.util.Date
в JSR-310 является Instant
, поэтому существует удобный способ toInstant()
для обеспечения преобразования:
Date input = new Date();
Instant instant = input.toInstant();
Экземпляр java.util.Date
не имеет понятия о временной зоне. Это может показаться странным, если вы назове toString()
на java.util.Date
, потому что toString
относится к временной зоне. Однако этот метод фактически использует временную зону Java по умолчанию для предоставления строки. Часовой пояс не является частью фактического состояния java.util.Date
.
Instant
также не содержит никакой информации о временной зоне. Таким образом, для преобразования из Instant
в локальную дату необходимо указать временную зону. Это может быть зона по умолчанию - ZoneId.systemDefault()
- или это может быть временная зона, которую контролирует ваше приложение, например часовая зона, из пользовательских настроек. Используйте метод atZone()
для применения временной зоны:
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
A ZonedDateTime
содержит состояние, состоящее из локальной даты и времени, временной зоны и смещения от GMT / UTC. Таким образом, дату - LocalDate
- можно легко извлечь, используя toLocalDate()
:
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();
Java 9 answer
В Java SE 9 новый метод , который немного упрощает эту задачу:
Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());
Эта новая альтернатива более прямая, создавая меньше мусора и, следовательно, должна работать лучше.