Коротка відповідь:
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.Date
JSR-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 року.