ТЛ; др
myJavaUtilDate // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant() // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate() // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) ) // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.
java.time
Вы используете ужасные старые классы времени и даты, которые были вытеснены много лет назад современными классами java.time, определенными в JSR 310.
Date
➙ Instant
A java.util.Date
представляет момент в формате UTC. Его замена есть Instant
. Вызовите новые методы преобразования, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
Часовой пояс
Укажите часовой пояс, в котором вы хотите, чтобы ваше новое время суток имело смысл.
Укажите правильное время имя зоны в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру из 2-4 букв, например EST
или, IST
поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Примените ZoneId
к, Instant
чтобы получить ZonedDateTime
. Тот же момент, та же точка на временной шкале, но другое время на настенных часах.
ZonedDateTime zdt = instant.atZone( z ) ;
Изменение времени суток
Вы просили изменить время суток. Примените a, LocalTime
чтобы изменить все части времени суток: час, минуту, секунду, доли секунды. Создается новый ZonedDateTime
экземпляр со значениями на основе оригинала. В java.time классы используют этот непреложный объекты шаблон , чтобы обеспечить безопасность потоков .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Первый момент дня
Но вы просили конкретно 00:00. Так что, очевидно, вам нужен первый момент дня. Осторожно: некоторые дни в некоторых зонах не начинаются в 00:00:00. Они могут начаться в другое время, например 01:00:00, из-за аномалий, таких как переход на летнее время (DST).
Пусть java.time определит первый момент. Извлеките часть, содержащую только дату. Затем пройдите часовой пояс, чтобы получить первый момент.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Настроить на UTC
Если вам нужно вернуться в UTC, извлеките файл Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Если вам нужно java.util.Date
взаимодействовать со старым кодом, который еще не обновлен до java.time , выполните преобразование.
java.util.Date d = java.util.Date.from( instant ) ;