tl; dr
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
Bạn đang sử dụng các lớp date-time cũ khủng khiếp đã được thay thế nhiều năm trước bởi các lớp java.time hiện đại được định nghĩa trong JSR 310.
Date ➙ Instant
Một java.util.Dateđại diện cho một thời điểm trong UTC. Thay thế của nó là Instant. Gọi các phương thức chuyển đổi mới được thêm vào các lớp cũ.
Instant instant = myJavaUtilDate.toInstant() ;
Múi giờ
Chỉ định múi giờ mà bạn muốn giờ mới trong ngày của mình có ý nghĩa.
Chỉ định một tên múi giờ thích hợp trong các định dạng của Continent/Region, chẳng hạn như America/Montreal, Africa/Casablancahoặc Pacific/Auckland. Không bao giờ sử dụng từ viết tắt 2-4 chữ cái, chẳng hạn như ESThoặc ISTvì chúng không phải là múi giờ thực, không được tiêu chuẩn hóa và thậm chí không phải là duy nhất (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Áp dụng ZoneIdcho Instantđể có được a ZonedDateTime. Cùng một thời điểm, cùng một điểm trên dòng thời gian, nhưng thời gian trên đồng hồ treo tường khác nhau.
ZonedDateTime zdt = instant.atZone( z ) ;
Thay đổi thời gian trong ngày
Bạn đã yêu cầu thay đổi thời gian trong ngày. Áp dụng a LocalTimeđể thay đổi tất cả các phần thời gian trong ngày: giờ, phút, giây, giây phân số. Một mới ZonedDateTimeđược khởi tạo, với các giá trị dựa trên bản gốc. Các lớp java.time sử dụng mẫu đối tượng bất biến này để cung cấp sự an toàn cho luồng .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Khoảnh khắc đầu tiên trong ngày
Nhưng bạn đã yêu cầu cụ thể cho 00:00. Vì vậy, dường như bạn muốn khoảnh khắc đầu tiên trong ngày. Lưu ý: một số ngày ở một số khu vực không bắt đầu lúc 00:00:00. Chúng có thể bắt đầu vào một thời điểm khác, chẳng hạn như 01:00:00 do các điểm bất thường như Giờ tiết kiệm ánh sáng ban ngày (DST).
Hãy để java.time xác định thời điểm đầu tiên. Trích xuất phần chỉ ngày. Sau đó vượt qua múi giờ để có được khoảnh khắc đầu tiên.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Điều chỉnh theo UTC
Nếu bạn cần quay lại UTC, hãy trích xuất một Instant.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant ➙ Date
Nếu bạn cần một java.util.Dateđể tương tác với mã cũ chưa được cập nhật lên java.time , hãy chuyển đổi.
java.util.Date d = java.util.Date.from( instant ) ;