2010-08-19 59 views
39

Trái tim tôi đang chảy máu nội bộ sau khi phải đi quá sâu để trừ hai ngày để tính toán khoảng thời gian trong số ngày:Làm thế nào để bạn trừ Ngày tháng trong Java?

GregorianCalendar c1 = new GregorianCalendar(); 
    GregorianCalendar c2 = new GregorianCalendar(); 
    c1.set(2000, 1, 1); 
    c2.set(2010,1, 1); 
    long span = c2.getTimeInMillis() - c1.getTimeInMillis(); 
    GregorianCalendar c3 = new GregorianCalendar(); 
    c3.setTimeInMillis(span); 
    long numberOfMSInADay = 1000*60*60*24; 
    System.out.println(c3.getTimeInMillis()/numberOfMSInADay); //3653 

mà nó chỉ có 2 dòng mã trong .NET, hoặc bất kỳ ngôn ngữ hiện đại, bạn tên .

Đây có phải là điều tệ hại của java không? Hoặc là có một phương pháp ẩn tôi nên biết?

Thay vì sử dụng GregorianCalendar, bạn có thể sử dụng lớp Date trong util? Nếu vậy, tôi có nên xem những thứ tinh tế như năm 1970 không?

Cảm ơn

+1

tại sao bạn sử dụng c3? Afaik bạn có thể bỏ ra ít nhất hai dòng cho c3;) – ZeissS

Trả lời

49

Đây thực sự là một trong những thất bại sử thi lớn nhất trong API Java chuẩn. Có một chút kiên nhẫn, sau đó bạn sẽ nhận được giải pháp của bạn theo hương vị của API Ngày và Giờ mới được chỉ định bởi JSR 310/ThreeTen, rất có thể sẽ được bao gồm trong Java sắp tới 8.

Cho đến lúc đó, bạn có thể tránh xa với JodaTime.

DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0); 
DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0); 
int days = Days.daysBetween(dt1, dt2).getDays(); 

Tác giả của nó, Stephen Colebourne, là cách anh chàng đứng sau JSR 310, vì vậy nó sẽ trông tương tự.

+3

Tôi có một dự án nhỏ và cần nó chỉ trong một vài nơi. Sắp trở lại từ .NET, tôi chỉ hơi giận dữ và thất vọng ở java. Cảm ơn bạn đã xác nhận. – Haoest

+1

Bạn cũng có thể tạo một phương thức tiện ích và ẩn nó ở độ sâu trong mã của bạn để bạn không bị API Calendar xấu xí trực tiếp làm phiền;) – BalusC

+0

JSR 310 có bao giờ nhìn thấy ngày không? –

3

Bạn cũng có thể xóa bản sao lịch thứ ba.

GregorianCalendar c1 = new GregorianCalendar(); 
GregorianCalendar c2 = new GregorianCalendar(); 
c1.set(2000, 1, 1); 
c2.set(2010,1, 1); 
c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis()); 
+3

Tôi không nghĩ rằng GregorianCalendar là bất biến, vì vậy nếu tôi nên sử dụng c2 sau này một lần nữa, tôi muốn có nó giá trị như nó đã được xác định ban đầu. – Haoest

18

Bạn có thể sử dụng phương pháp sau đây:

SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd"); 

long d1=formater.parse("2001-1-1").getTime(); 
long d2=formater.parse("2001-1-2").getTime(); 

System.out.println(Math.abs((d1-d2)/(1000*60*60*24))); 
0

Dưới đây là cách tiếp cận cơ bản,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

Date beginDate = dateFormat.parse("2013-11-29"); 
Date endDate = dateFormat.parse("2013-12-4"); 

Calendar beginCalendar = Calendar.getInstance(); 
beginCalendar.setTime(beginDate); 

Calendar endCalendar = Calendar.getInstance(); 
endCalendar.setTime(endDate); 

Có cách đơn giản để thực hiện nó. Chúng ta có thể sử dụng phương thức Calendar.add với vòng lặp. Những ngày trừ giữa beginDate và ENDDATE, và mã thực hiện như dưới đây,

int minusDays = 0; 
while (true) { 
    minusDays++; 

    // Day increasing by 1 
    beginCalendar.add(Calendar.DAY_OF_MONTH, 1); 

    if (dateFormat.format(beginCalendar.getTime()). 
      equals(dateFormat.format(endCalendar).getTime())) { 
    break; 
    } 
} 
System.out.println("The subtraction between two days is " + (minusDays + 1));** 
+0

Sử dụng tuyệt vời từ "trừ" :) –

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