тл; д-р
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
Миттєвий 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 ) ;