ТЛ; др
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 ) ;