2009-04-05 38 views
8

Chương trình của tôi là tạo ra (sản xuất) một Kurosawa và làm cho khách hàng sản xuất nó.Số học ngày trong Java, thêm 3 tháng kể từ hôm nay

Mỗi lần chúng tôi tạo Kurosawa, chúng tôi phải in id của nó, ngày sản xuất và ngày hết hạn, là 3 tháng kể từ ngày sản xuất.

Vấn đề của tôi là: Làm cách nào để tính ngày sau 3 tháng?

+0

BTW, Kurosawa là gì? –

+1

Theo Wikipedia, đó là rượu sake được sản xuất tại Saku, Nagano, Nhật Bản. –

Trả lời

15

Sử dụng được tích hợp sẵn Java Calendar API.

Calendar c = Calendar.getInstance(); 
c.add(Calendar.MONTH, 3); 

Tham khảo API để biết chính xác cách in ngày, theo định dạng bạn đang tìm kiếm.

9

Bạn cũng có thể sử dụng nhiều mạnh mẽ và dễ dàng hơn để sử dụng Joda Time Library:

DateMidnight productionDate = new DateMidnight(); 
DateMidnight expirationDate = productionDate.plusMonths(3); 
System.out.println(expirationDate.toString("dd.MM.yyyy")); 

Joda Thời gian có nhiều ưu điểm so với các built-in Java Calendar API.

+0

Tại sao sử dụng Joda cho một cái gì đó đơn giản như thêm 3 tháng vào một ngày? – javashlook

+1

Bạn có quyền nhưng khi bạn thêm 3 tháng vào một java.util.Date/Calendar bạn thao tác cùng một trường hợp có thể bị lỗi. Các đối tượng Joda-Time là bất biến.Và tôi nghĩ bạn thường làm điều gì đó hơn là hẹn hò hơn là chỉ thêm 3 tháng. Tôi hy vọng rằng Java7 sẽ bao gồm Joda-Time (JSR310) –

0

Nếu bạn cần phải làm việc với ngày số học Joda làm việc tốt hơn, vì Lịch thích dấu thời gian.

0

/Lịch lớp java trừu tượng. Vì vậy, bạn cần sử dụng lớp GregorianCalendar./

java.util.GregorianCalendar gC = new java.util.GregorianCalendar(); 

java.util.Date yourDate = new java.util.Date(); 
gC.setTime(yourDate); 

/Thêm 3 tháng/

gC.add(java.util.Calendar.MONTH_OF_YEAR, 3); 

/quay trở lại 1 tuần/

gC.add(java.util.Calendar.WEEK_OF_YEAR, -1); 
+2

[getInstance] (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance%28%29) các phương thức của Lịch là tĩnh để bạn có thể sử dụng chúng. – KSev

+1

Và được ưa thích, bởi vì getInstance() là một phương pháp nhà máy tĩnh (xem Java hiệu quả, Joshua Bloch) sẽ cố gắng xác định thời gian tốt nhất cho ngôn ngữ của bạn. –

1

tl; dr

LocalDate.now()   // Determine today’s date. 
     .plusMonths(3) // Add three months. 

java.time

Cách tiếp cận hiện đại sử dụng lớp học java.time.

Lớp LocalDate đại diện cho giá trị chỉ có ngày không có thời gian trong 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.

Nếu không xác định múi giờ, JVM ngầm áp dụng múi giờ mặc định hiện tại của nó. Mặc định đó có thể thay đổi bất kỳ lúc nào, do đó kết quả của bạn có thể thay đổi. Tốt hơn để chỉ định múi giờ mong muốn/dự kiến ​​của bạn một cách rõ ràng làm đối số.

Chỉ định proper time zone name ở định dạng 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); 

Thêm ba tháng, để cho java.time làm toán.

LocalDate threeMonthsLater = today.plusMonths(3) ; 

Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. 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?

  • Java SE 8, Java SE 9, và sau đó
    • Built-in.
    • Một phần của API Java chuẩn với gói được triển khai.
    • Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
  • Java SE 6Java SE 7
    • Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
  • Android
    • phiên bản sau của triển khai bó Android của các lớp java.time.
    • Đối với Android trước đó, dự án ThreeTenABP thích hợp ThreeTen-Backport (đã đề cập ở trên). Xem How to use ThreeTenABP….

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