2010-05-17 98 views

Trả lời

21

Trước tiên, bạn cần phải xác định cái nào cũ hơn cái kia. Sau đó, sử dụng vòng lặp while trong đó bạn kiểm tra xem vòng lặp cũ có phải là after() phiên bản mới hơn không. Gọi Calendar#add() với một (1) Calendar.YEAR trên thẻ cũ hơn để thêm năm. Giữ một quầy để đếm số năm.

Kickoff dụ:

Calendar myBirthDate = Calendar.getInstance(); 
myBirthDate.clear(); 
myBirthDate.set(1978, 3 - 1, 26); 
Calendar now = Calendar.getInstance(); 
Calendar clone = (Calendar) myBirthDate.clone(); // Otherwise changes are been reflected. 
int years = -1; 
while (!clone.after(now)) { 
    clone.add(Calendar.YEAR, 1); 
    years++; 
} 
System.out.println(years); // 32 

Điều đó nói rằng, của DateCalendar API trong Java SE thực sự thất bại hoành tráng. Có một API ngày mới trong việc lên kế hoạch cho Java 8 sắp tới, số JSR-310 tương tự như Joda-Time. Bây giờ bạn có thể muốn xem xét Joda-Time vì nó thực sự dễ dàng tính toán/sửa đổi ngày/giờ như thế này. Dưới đây là ví dụ sử dụng Joda-Time:

DateTime myBirthDate = new DateTime(1978, 3, 26, 0, 0, 0, 0); 
DateTime now = new DateTime(); 
Period period = new Period(myBirthDate, now); 
int years = period.getYears(); 
System.out.println(years); // 32 

Rõ ràng hơn và súc tích hơn, phải không?

+6

hoặc .getYears Years.yearsBetween (myBirthDate, bây giờ)(); – mtpettyp

+0

tôi không thể tạo đối tượng của thời kỳ. Nó có vẻ là tư nhân theo java.util.time ... bạn có thể giúp tôi ra xin vui lòng làm thế nào tôi có thể tìm thấy sự khác biệt của năm sử dụng Thời gian ?? –

+0

@ Mr.Noddy: đoạn mã là JodaTime không phải là JavaTime. Trong JavaTime, sử dụng 'Period # between()'. Xem thêm javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html – BalusC

0

Hoặc bạn chỉ có thể sử dụng Calendar.getTimeInMillis():

long msYear = 1000L * 60 * 60 * 24 * 365; 
long msDiff = c2.getTimeInMillis() - c1.getTimeInMillis(); 
System.out.println("Years diff: " + String.valueOf(msDiff/msYear)); 

Sửa này bỏ qua năm nhuận. Nhưng nếu bạn đang tìm kiếm một đại diện số nguyên của số năm những năm nhuận là không liên quan trong thời gian ngắn hơn nửa thiên niên kỷ hoặc lâu hơn.

Điều này là rất chính xác để tính tuổi của ai đó, ví dụ. Nhưng không đủ chính xác để nói sinh nhật của họ.

Nếu bạn cần sự khác biệt năm của bạn chính xác hơn ba chữ số có nghĩa trong vòng đời người (khoảng 80,00 năm so với 80,05), bạn nên sử dụng giải pháp "chính thức".

Nếu không, không có lý do cụ thể nào để nỗ lực thêm cho mức độ chính xác mà bạn sẽ không sử dụng.

+3

Tài khoản này có cho năm nhuận, bước nhảy vọt, v.v. không? –

+0

Không. Giả sử rằng nếu bạn đang tìm kiếm bội số của năm, bạn không quá lo ngại về một hoặc hai ngày không khớp. Nếu bạn tìm kiếm chiều dài chính xác của năm trong Wikipedia, bạn có thể nhận được nó gần như bạn muốn trong thời gian dài. –

+0

@Nick: leap * minutes * ?? –

10
Calendar dobDate; // Set this to date to check 
Calendar today = Calendar.getInstance(); 
int curYear = today.get(Calendar.YEAR); 
int curMonth = today.get(Calendar.MONTH); 
int curDay = today.get(Calendar.DAY_OF_MONTH); 

int year = dobDate.get(Calendar.YEAR); 
int month = dobDate.get(Calendar.MONTH); 
int day = dobDate.get(Calendar.DAY_OF_MONTH); 

int age = curYear - year; 
if (curMonth < month || (month == curMonth && curDay < day)) { 
    age--; 
} 

Điều này tránh lặp và phải chính xác trong ngày.

2
double diff = d2.getTime() - d1.getTime(); 
double d = 1000 * 60 * 60 * 24 * 365; 
return (int) Math.round(diff/d); 

(java.lang.Math)

+3

Lưu ý: Hãy cẩn thận với những năm nhuận và những kỳ quặc lịch khác như vậy. – michaelb958

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