2013-06-02 122 views
10

我想實現讓我們說'社交'日期格式。我已經有了一個解決方案,但感覺應該存在一個更好的解決方案。爲什麼社會和這是什麼意思:日期到'社交'格式字符串

如果我們看看我們可以下一個選項之間區別的帖子Facebook的時間戳:

  1. X秒前
  2. X分鐘前
  3. X小時前
  4. 昨天上午11時07
  5. 週五下午9點36
  6. 5月5日下午5:00
  7. 11月20日9:05 PM,2012

我做了更好的解釋下一個可視時間表: enter image description here
例如:
如果當前時間爲: 下午5時33分,在20秒週三
社會後發生了:00:00週二 < - >下午5點33分,20秒週二
那麼日期格式應該是這樣的:昨天上午11:07,

解決方案我有
我檢查每個選項(在數7),並返回「社會」的日期字符串。

我這是怎麼檢查選項1

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

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

我這是怎麼檢查選項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"); 
} 

我檢查以同樣的方式其他選項。


一些方法我在用我的,如果上述聲明:

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(); 
} 


最後,我的問題:

  1. 是否有轉換兩者之間的差異的一個更好的辦法日期爲'社交'字符串格式?正如我所說,我覺得有些其他方式可能會延伸DateFormat對象可以使用,但我不確定。

  2. 如何本地化像「昨天」字符串「在」,使得不同的Local組將改變字符串合適的語言?


對不起,這麼長的問題,但我找不到更短的方式來解釋的必要。
感謝

回答

3

目前已經是一個實現的圖書館,如果你不想重新發明輪子

PrettyTime,本地化支持

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

很有趣......,好像它是我尋找的是什麼。我會檢查這個圖書館。謝謝! – sromku

+0

不客氣 –