2010-03-24 25 views
14

Tôi không hoàn toàn chắc chắn trường nào sẽ sử dụng khi thêm hơn 30 ngày vào đối tượng Lịch Java. Có sự khác biệt nào ở giữa Calendar.DAY_OF_MONTHCalendar.DAY_OF_YEAR không?thêm hơn 30 ngày với phương thức add() của Lịch trong Java

Ví dụ:

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_YEAR, 90); 

vs

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_MONTH, 90); 

Cảm ơn.

+0

Mã của bạn ngụ ý rằng tất cả các tháng đều có 30 ngày. – whiskeysierra

Trả lời

17

Tôi không nghĩ điều đó tạo nên sự khác biệt khi bạn gọi thêm. Sự khác biệt là rất quan trọng khi bạn gọi getters.

Cả hai phương pháp đều hoạt động tốt, đúng không? Trong hơn 30 ngày, cũng như số tiền âm.

The (phải thừa nhận là phức tạp) nguồn cho GregorianCalendar # add có phần này:

case DAY_OF_MONTH: // synonym of DATE 
case DAY_OF_YEAR: 
case DAY_OF_WEEK: 
    break; 
+0

Cảm ơn bạn đã xác nhận nguồn. – Haes

+2

Hành vi của over-/underflow khi sử dụng phương thức add được xác định rõ trong tài liệu API: "tràn xảy ra khi giá trị trường vượt quá phạm vi của nó và kết quả là trường lớn hơn tiếp theo được tăng hoặc giảm và giá trị trường là điều chỉnh trở lại phạm vi của nó. " Vì vậy, tràn trường DAY_OF_MONTH, có nghĩa là trường MONTH (tiếp theo lớn hơn) được tăng lên và trường DAY_OF_MONTH được đặt thành 1 (được điều chỉnh trở lại phạm vi hợp lệ của nó). – jarnbjo

+0

@jarnbjo: và tôi nghĩ chính xác điều tương tự xảy ra cho DAY_OF_YEAR, DAY_OF_WEEK và DATE. – Thilo

0

tl; dr

LocalDate.now(ZoneId.of("America/Montreal")) 
     .plusDays(30) 

Chi tiết

Dễ dàng hơn bây giờ với các lớp java.time hiện đại thay thế các lớp học Calendar & Date cũ.

LocalDate

Lớp LocalDate đại diện cho một giá trị ngày tháng chỉ mà không cần thời gian của ngày và không có múi giờ.

Múi giờ rất quan trọng trong việc xác định ngày. Đối với bất kỳ thời điểm cụ thể nào, ngày thay đổi trên toàn cầu theo múi giờ. Ví dụ: một vài phút sau nửa đêm ở Paris France là một ngày mới trong khi vẫn “ngày hôm qua” trong Montréal Québec.

Chỉ định proper time zone name trong đị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 3-4 ký tự như EST hoặc IST vì chúng là không múi giờ thực, không được chuẩn hóa và thậm chí không độc đáo (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Bạn có thể thêm số ngày vào đó.

LocalDate later = today.plusDays(30); 

Period

Bạn có thể đại diện cho một khoảng thời gian với lớp Period.

Period thirtyDays = Period.ofDays(30); 

Bạn có thể thực hiện ngày toán bằng cách gọi plus hoặc minus phương pháp.

LocalDate later = today.plus(thirtyDays); 

Về java.thời gian

Khuôn khổ java.time được tích hợp vào Java 8 trở lên. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. 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.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra 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 những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

Các vấn đề liên quan