tl; dr
tư vấn "thực hành tốt nhất" hiện tại xung quanh Date
vàCalendar
là nó tốt nhất để luôn luôn ủng hộ Calendar
hơnDate
Tránh các lớp kế thừa hoàn toàn. Sử dụng các lớp java.time thay thế.
- Trong một khoảnh khắc trong UTC , hãy sử dụng
Instant
(tương đương hiện đại Date
)
- Đối với một khoảnh khắc trong một múi giờ cụ thể , hãy sử dụng (tương đương hiện đại với
ZonedDateTime
GregorianCalendar
)
- Trong một khoảnh khắc trong phần bù từ UTC cụ thể , hãy sử dụng
OffsetDateTime
(không tương đương trong các lớp kế thừa)
- Đối với thời gian ngày (không phải là một khoảnh khắc) với múi giờ hoặc độ lệch không xác định, hãy sử dụng (không tương đương trong các lớp kế thừa)
LocalDateTime
Chi tiết
Câu trả lời của Ortomala Lokni là đúng khi đề xuất sử dụng các lớp java.time hiện đại thay vì các lớp thời gian cũ kế thừa rắc rối (Date
, Calendar
, vv). Nhưng Câu trả lời đó cho thấy lớp sai là tương đương (xem nhận xét của tôi về Câu trả lời đó).
Sử dụng java.time
Các lớp java.time là một cải tiến lớn so với các lớp ngày giờ cũ, sự khác biệt giữa ngày và đêm. Các lớp học cũ được thiết kế kém, khó hiểu và rắc rối. Bạn nên tránh các lớp cũ bất cứ khi nào có thể. Nhưng khi bạn cần chuyển đổi sang / từ cái cũ / cái mới, bạn có thể làm như vậy bằng cách gọi các phương thức mới thêm vào cái cũ lớp .
Để biết thêm thông tin về chuyển đổi, hãy xem sơ đồ Trả lời và tiện lợi của tôi sang Câu hỏi khác, Chuyển đổi java.util.Date sang loại java java.time nào? .
Tìm kiếm Stack Overflow cung cấp cho hàng trăm câu hỏi và câu trả lời ví dụ về việc sử dụng java.time. Nhưng đây là một bản tóm tắt nhanh chóng.
Instant
Nhận thời điểm hiện tại với một Instant
. Các Instant
lớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).
Instant instant = Instant.now();
ZonedDateTime
Để xem cùng một khoảnh khắc đó qua ống kính của thời gian đồng hồ treo tường của một số khu vực cụ thể , hãy áp dụng múi giờ ( ZoneId
) để có được a ZonedDateTime
.
Múi giờ
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 chữ viết tắt 3-4 chữ cái như EST
hoặc IST
chúng không phải là múi giờ thực, không được chuẩn hóa và thậm chí không phải là duy nhất (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Bù lại
Múi giờ là lịch sử thay đổi của khu vực trong phần bù từ UTC . Nhưng đôi khi bạn chỉ được cung cấp một phần bù mà không có vùng đầy đủ. Trong trường hợp đó, sử dụng OffsetDateTime
lớp.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Sử dụng múi giờ tốt hơn là sử dụng bù trừ đơn thuần.
LocalDateTime
Các địa phương trực tuyến trong các Local…
lớp có nghĩa là bất kỳ địa phương, không phải là một địa phương cụ thể. Vì vậy, tên có thể phản trực giác.
LocalDateTime
, LocalDate
và LocalTime
cố tình thiếu bất kỳ thông tin nào về phần bù hoặc múi giờ. Vì vậy, họ không đại diện cho những khoảnh khắc thực tế, họ không phải là điểm trên dòng thời gian. Khi nghi ngờ hoặc nhầm lẫn, sử dụng ZonedDateTime
chứ không phải LocalDateTime
. Tìm kiếm Stack Overflow để thảo luận nhiều hơn.
Dây
Không kết hợp các đối tượng thời gian ngày với các chuỗi đại diện cho giá trị của chúng. Bạn có thể phân tích một chuỗi để lấy một đối tượng thời gian và bạn có thể tạo một chuỗi từ một đối tượng thời gian. Nhưng chuỗi không bao giờ là thời gian ngày.
Tìm hiểu về các định dạng ISO 8601 tiêu chuẩn , được sử dụng theo mặc định trong các lớp java.time.
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên, bạn có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu của mình. Không cần các chuỗi cũng như java.sql. *.
Nơi để có được các lớp java.time?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .