2014-09-12 14 views
19

Tôi có trường ngày (lastUpdated). Tôi muốn dịch ngày này sang định dạng có thể đọc được của con người như 'hôm nay', '1 ngày trước', '2 ngày trước', ...Định dạng ngày tương đối với định dạng có thể đọc được của con người trong Android bằng cách sử dụng API DateUtils Android

Tôi đang sử dụng android.text.format.DateUtils API có trong thư viện Android.

Đây là cố gắng của tôi:

DateUtils.getRelativeDateTimeString(context, 
        lastUpdated.getTime(), 
        DateUtils.DAY_IN_MILLIS, 
        DateUtils.WEEK_IN_MILLIS, 
        DateUtils.FORMAT_SHOW_YEAR); 

Đây là kết quả:

0 day ago, 12:00am 
yesterday, 9:30am 
2 days ago, 1:30pm 
Sep 4, 12:30pm 

Kết quả tôi mong đợi: (Không có thông tin thời gian)

0 day ago --------- This should be 'today' 
yesterday 
2 days ago 
Sep 4 

LƯU Ý rằng, nếu tôi xóa thời gian từ lastUpdated. Nó sẽ hiển thị '12: 00am' để biết thông tin thời gian.

Có ai có ý tưởng nào không? Có cách nào để loại bỏ thời gian từ đầu ra không?

Cảm ơn bạn!

Trả lời

49

Bạn có thể sử dụng DateUtils.getRelativeTimeSpanString cho rằng:

long now = System.currentTimeMillis(); 
DateUtils.getRelativeTimeSpanString(lastUpdated.getTime(), now, DateUtils.DAY_IN_MILLIS); 
+2

Tôi sử dụng tính năng này và hoạt động tốt cho API 18+, nhưng API 16 và 17 hiển thị "trong 0 ngày" và "ngày mai" thay vì "Hôm nay" và "Ngày mai" trên trình giả lập Android. Có ai có ý tưởng gì không? – levavare

+0

Tuyệt vời ............ –

1

có vẻ như bạn muốn có một trình xử lý tùy chỉnh cho những lần gần đây và một cái gì đó còn nhiều hơn cho những ngày xa hơn. một cái gì đó như thế này sẽ làm việc:

public String getTimeDiff(long secondsTimeDiff) 
{  
    long secondsInOneDay = 84600; 
    int maxDaysAgo = 10; 

    if (secondsTimeDiff < secondsInOneDay) 
    { 
     return "today"; 
    } 
    else if (secondsTimeDiff < 2*secondsInOneDay) 
    { 
     return "yesterday"; 
    } 
    else if (secondsTimeDiff < maxDaysAgo*secondsInOneDay) 
    { 
     int days = (int) (secondsTimeDiff/secondsInOneDay); 
     return days + " days ago"; 
    } 
    else 
    { 
     //use normal DateUtils logic here... 
     return "...."; 
    } 
} 
+3

giải pháp Đó là lớn dễ bị lỗi và không hỗ trợ i18n. Tôi rất khuyên bạn nên sử dụng lớp DateUtils. – JakeWilson801

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