以"社交"格式表示字符串的日期

sro*_*mku 11 java date date-format

我试图实现让我们说'社交'日期格式.我已经有了解决方案,但感觉应该存在更好的解决方案.为什么社交,我的意思是:

如果我们查看帖子的Facebook时间戳,我们可以区分下一个选项:

  1. X秒前
  2. X分钟前
  3. X小时前
  4. 昨天上午11点07分
  5. 星期五晚上9:36
  6. 5月5日下午5:00
  7. 2012年11月20日晚上9:05

我制作了下一个视觉时间表以便更好地解释: 在此输入图像描述
例如:
如果当前时间是: 下午5:33,周二20秒
社交帖子发生在:星期二00:00 am - 下午5:33 pm,星期二20秒,
那么日期格式应该是:昨天上午11点07分.

我有解决方案:
我检查每个选项(7个计数)并返回'social'日期字符串.

这是我检查选项1的方法:

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

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

这是我检查选项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");
}
Run Code Online (Sandbox Code Playgroud)

我以同样的方式检查其他选项.


我在上面的if语句中使用的一些方法:

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();
}
Run Code Online (Sandbox Code Playgroud)


最后,我的问题:

  1. 有没有更好的方法将两个日期之间的差异转换为"社交"字符串格式?正如我所说,我觉得DateFormat可能会使用其他方式,例如可能使用扩展对象,但我不确定.

  2. 如何本地化字符串,如'昨天''在',这样不同的Local集合将字符串更改为合适的语言?


很抱歉这么长的问题,但我找不到更短的方式来解释需要.
谢谢

Jig*_*shi 3

如果您不想重新发明轮子,已经有一个实现的库可以实现这一点

\n\n

请参阅PrettyTime,具有本地化支持

\n\n
PrettyTime p = new PrettyTime();\nSystem.out.println(p.format(new Date()));\n//prints: \xe2\x80\x9cright now\xe2\x80\x9d\n\nSystem.out.println(p.format(new Date(1000*60*10)));\n//prints: \xe2\x80\x9c10 minutes from now\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n