2012-04-25 54 views
10

Tôi cố gắng để làm tính toán ngày giữa 2 ngày như sau:(Java/Android) Tính ngày giữa 2 ngày và trình bày kết quả trong một định dạng cụ thể

  1. Lấy ngày hiện tại
  2. Lấy khứ hay tương lai ngày
  3. Tính chênh lệch giữa số không. 1 và không. 2
  4. hiện ngày theo định dạng sau
    • Nếu kết quả là trong quá khứ (2 ngày trước) hoặc trong tương lai (trong 2 ngày)
    • Format sẽ: ngày, tuần, tháng, năm

Tôi đã thử các cách khác nhau nhưng không thể đạt được kết quả tôi muốn ở trên. Tôi đã phát hiện ra rằng Android DatePicker hộp thoại chuyển đổi ngày thành Số nguyên. Tôi chưa tìm được cách để tạo widget DatePicket để trả về biến ngày thay vì số nguyên.

private DatePickerDialog.OnDateSetListener mDateSetListener = 
     new DatePickerDialog.OnDateSetListener() { 

      public void onDateSet(DatePicker view, **int** year, 
            **int** monthOfYear, **int** dayOfMonth) { 
       enteredYear = year; 
       enteredMonth = monthOfYear; 
       enteredDay = dayOfMonth; 
      } 
     }; 

Tôi đã cố chuyển đổi ngày hệ thống thành Số nguyên, dựa trên ở trên, nhưng điều này không thực sự hiệu quả khi tính toán ngày giữa 2 ngày.

private void getSystemDate(){ 
    final Calendar c = Calendar.getInstance(); 

     mYear = c.get(Calendar.YEAR); 
     systemYear = mYear; 

     mMonth = c.get(Calendar.MONTH); 
     systemMonth = mMonth + 1; 

     mDay = c.get(Calendar.DAY_OF_MONTH); 
     systemDay = mDay; 

} 
+0

ints sẽ không hoạt động để tính toán differenc e giữa các ngày. Bạn sẽ cần phải sử dụng một thời gian dài (như AedonEtLIRA đã nói). – jahroy

+0

Đó là vấn đề tôi gặp phải - theo mặc định, DatePicker trong Android chuyển đổi ngày thành số nguyên, như đoạn mã trên cho thấy. – striders

+0

Nó không ngay lập tức có ý nghĩa với tôi làm thế nào bạn có thể sử dụng một int để đại diện cho một ngày. Trừ khi Android java là khác nhau, bạn không thể đại diện cho một dấu thời gian như là một int vì giá trị int tối đa là không đủ lớn. Dấu thời gian rất lớn ... như hàng tỷ tỷ và hàng nghìn tỷ. – jahroy

Trả lời

15
/** 
    * Returns a string that describes the number of days 
    * between dateOne and dateTwo. 
    * 
    */ 

public String getDateDiffString(Date dateOne, Date dateTwo) 
{ 
    long timeOne = dateOne.getTime(); 
    long timeTwo = dateTwo.getTime(); 
    long oneDay = 1000 * 60 * 60 * 24; 
    long delta = (timeTwo - timeOne)/oneDay; 

    if (delta > 0) { 
     return "dateTwo is " + delta + " days after dateOne"; 
    } 
    else { 
     delta *= -1; 
     return "dateTwo is " + delta + " days before dateOne"; 
    } 
} 

Chỉnh sửa: Chỉ cần thấy cùng một câu hỏi trong chủ đề khác: how to calculate difference between two dates using java

Edit2: Để có được Năm/Tháng/tuần, làm một cái gì đó như thế này:

int year = delta/365; 
int rest = delta % 365; 
int month = rest/30; 
rest = rest % 30; 
int weeks = rest/7; 
int days = rest % 7; 
+0

Cảm ơn thông tin! Điều này sẽ hiển thị sự khác biệt trong ngày. Điều gì sẽ là cách thích hợp để hiển thị điều này trong ngày, tuần VÀ năm? – striders

+0

Bạn cần thực hiện một số phép toán và sử dụng toán tử modulo. Để hiển thị x giây bằng phút và giây, bạn sẽ làm điều này: int minutes = x/60; int giây = x% 60; Chuỗi timeText = phút + "phút" + giây + "giây"; Dấu phần trăm được gọi là toán tử modulo. – jahroy

+0

@striders Đã cập nhật câu trả lời của tôi ... Vui lòng chấp nhận câu trả lời nếu bạn cho rằng đó là chính xác – San

1
long delta = Date2.getTime() - Date1.getTime(); 

new Date(delta); 

Từ đây, bạn chỉ cần chọn định dạng của bạn. Có thể sử dụng một định dạng ngày? Đối với việc xác định các công cụ trong tương lai và tất cả điều đó, bạn chỉ có thể xem liệu đồng bằng có dương hay âm hay không. Một đồng bằng âm sẽ chỉ ra một sự kiện trong quá khứ.

+1

Tôi nghĩ ngày mới (delta) sẽ không hoạt động vì delta không phải là mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00 GMT. – San

1

Vâng, java/android API có tất cả câu trả lời cho bạn:

Calendar myBirthday=Calendar.getInstance(); 
    myBirthday.set(1980, Calendar.MARCH, 22); 
    Calendar now = Calendar.getInstance(); 
    long diffMillis= Math.abs(now.getTimeInMillis()-myBirthday.getTimeInMillis()); 
    long differenceInDays = TimeUnit.DAYS.convert(diffMillis, TimeUnit.MILLISECONDS); 
Các vấn đề liên quan