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/Casablanca
hoặ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ư EST
hoặc IST
vì 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 ZoneId
cho 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 ) ;