Коротка відповідь:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Пояснення: (виходячи з цього питання про LocalDate)
Незважаючи на свою назву, java.util.Dateявляє собою момент на часовій лінії, а не "дату". Фактичні дані, що зберігаються в об'єкті, - цеlong кількість мілісекунд з 1970-01-01T00: 00Z (опівночі на початку 1970 GMT / UTC).
Клас, еквівалентний java.util.DateJSR-310, є Instant, таким чином, є зручні методи забезпечення перетворення сюди:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
java.util.DateПримірник не має поняття про час зони. Це може здатися дивним, якщо ви зателефонуєте toString()на "a" java.util.Date, оскільки значення toStringвідносно часового поясу. Однак цей метод фактично використовує часовий пояс Java за замовчуванням на ходу для надання рядка. Часовий пояс не є частиною фактичного стану Росії java.util.Date.
А Instantтакож не містить жодної інформації про часовий пояс. Таким чином, для перетворення з Instantлокального на дату-час необхідно вказати часовий пояс. Це може бути зона за замовчуванням - ZoneId.systemDefault()- або це часовий пояс, яким керує ваша програма, наприклад часовий пояс із налаштувань користувача. LocalDateTimeмає зручний заводський метод, який займає як миттєвий, так і часовий пояс:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Зворотним LocalDateTimeчином часовий пояс задається за допомогою виклику atZone(ZoneId)методу. ZonedDateTimeПотім можуть бути перетворені безпосередньо до Instant:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Зауважте, що перехід від LocalDateTimeдо ZonedDateTimeможе потенційно внести несподівану поведінку. Це пояснюється тим, що не кожен місцевий час існує через літній час. Восени / восени спостерігається перекриття локальної часової лінії, де однаковий місцевий час зустрічається двічі. Навесні є розрив, де зникає година. Докладніше atZone(ZoneId)про те, що буде робити перетворення, див. У Javadoc програми .
Підсумок: якщо ви об'їжджаєте дорогу java.util.Dateна a LocalDateTimeі назад до java.util.Dateвас, ви можете закінчити іншу мить через літній час.
Додаткова інформація: Є ще одна різниця, яка вплине на дуже давні дати. java.util.Dateвикористовує календар, який змінюється 15 жовтня 1582 року, а дати до цього використовують юліанський календар замість григоріанського. Навпаки, java.time.*використовує календарну систему ISO (еквівалентну грегоріанській) за весь час. У більшості випадків використання система календарів ISO - це те, що ви хочете, але ви можете побачити дивні ефекти при порівнянні дат до 1582 року.