2013-06-02 37 views
10

Tôi đang cố gắng đạt được định dạng ngày ‘xã hội’ của chúng ta. Tôi đã có một giải pháp, nhưng nó cảm thấy giống như một giải pháp tốt hơn nên tồn tại. Tại sao xã hội và làm những gì tôi muốn nói:Ngày thành chuỗi theo định dạng 'xã hội'

Nếu chúng ta nhìn vào tem thời gian Facebook của bài viết chúng ta có thể phân biệt giữa các tùy chọn sau:

  1. X giây
  2. X phút trước
  3. X giờ trước
  4. Hôm qua lúc 11:07
  5. Thứ Sáu lúc 9:36
  6. ngày 5 tháng 5 lúc 5:00 chiều
  7. 20 Tháng 11 tại 9:05, 2012

tôi đã thực hiện thời gian hình ảnh tiếp theo cho lời giải thích tốt hơn: enter image description here
Ví dụ:
Nếu thời gian hiện tại là: 17:33, 20 giây thứ tư
các bài xã hội đã xảy ra giữa: 12:00 Thứ ba < ->17:33, 20 giây thứ ba,
sau đó định dạng ngày nên được như thế : Hôm qua lúc 11:07 sáng.

Giải pháp Tôi có:
tôi kiểm tra mỗi tùy chọn (7 số) và trả lại chuỗi ngày 'xã hội'.

Đây là cách tôi kiểm tra cho tùy chọn 1:

Date postDate = getPostDate(); 
Date nowDate = getNowDate(); 

// check passed seconds 
int passedSeconds = getPassedSeconds(postDate, nowDate); 
if (passedSeconds < 60) 
{ 
    return passedSeconds + " seconds ago"; 
} 

Đây là cách tôi kiểm tra cho tùy chọn 4:

// check yesterday 
Date startYesterdayDate = getZeroDayBeforeDays(nowDate, 1); 
int compare = compare(startYesterdayDate, postDate); 

// if postDate comes after startYesterdayDate 
if (compare == -1) 
{ 
    return "Yesterday at " + getString(postDate, "HH:mma"); 
} 

tôi kiểm tra tùy chọn khác theo cách tương tự.


Một số phương pháp tôi sử dụng trong tôi nếu phát biểu trên:

public static String getString(Date date, String format) 
{ 
    Format formatter = new SimpleDateFormat(format, Locale.US); 
    String s = formatter.format(date); 
    return s; 
} 

/** 
* For example: today - 1 day 
* 
* @param date 
* @param numOfMinusDays 
* @return 
*/ 
public static Date getDateMinusDays(Date date, int numOfMinusDays) 
{ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    calendar.add(Calendar.DAY_OF_MONTH, (0 - numOfMinusDays)); 
    return calendar.getTime(); 
} 

/** 
* Get the day before today at 00:00 am.<br> 
* Means, if passed day = <b>Nov 5 13:04</b>, then returned date will be = <b>Nov 4 00:00</b> for days = 1 
* 
* @param date 
* @param days Numner of days to reduce 
* @return 
*/ 
public static Date getZeroDayBeforeDays(Date date, int days) 
{ 
    Calendar yesterday = Calendar.getInstance(); 
    yesterday.setTime(getDateMinusDays(date, days)); 
    yesterday.set(Calendar.HOUR_OF_DAY, 0); 
    yesterday.set(Calendar.MINUTE, 0); 
    yesterday.set(Calendar.SECOND, 0); 
    yesterday.set(Calendar.MILLISECOND, 1); 
    return yesterday.getTime(); 
} 


Cuối cùng, câu hỏi của tôi:

  1. Có cách nào tốt hơn về chuyển đổi sự khác biệt giữa hai Ngày có định dạng chuỗi 'xã hội'? Như tôi đã nói, tôi cảm thấy rằng một số cách khác như có thể mở rộng đối tượng DateFormat có thể được sử dụng, nhưng tôi không chắc chắn.

  2. Làm thế nào để bản địa hoá các chuỗi như 'Hôm qua''at', như vậy khác nhau Local bộ sẽ thay đổi chuỗi sang ngôn ngữ phù hợp?


Xin lỗi vì một câu hỏi dài như vậy, nhưng tôi không thể tìm được đường ngắn hơn để giải thích sự cần thiết.
Cảm ơn

Trả lời

3

Hiện đã là một trong những thư viện thực hiện cho rằng nếu bạn không muốn tái phát minh ra bánh xe

Xem PrettyTime, với sự hỗ trợ nội địa hóa

PrettyTime p = new PrettyTime(); 
System.out.println(p.format(new Date())); 
//prints: “right now” 

System.out.println(p.format(new Date(1000*60*10))); 
//prints: “10 minutes from now” 
+0

Rất thú vị .., nó có vẻ như nó là những gì tôi tìm kiếm. Tôi sẽ kiểm tra thư viện này. Cảm ơn! – sromku

+0

bạn được chào đón –

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