将日期转换为“社交”格式的字符串

11

我试图实现一个类似于“社交”日期格式的功能。我已经有了一个解决方案,但感觉应该存在更好的解决方案。为什么要使用“社交”(social)这个词,我指的是:

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

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

我制作了下面这张可视化时间轴以进行更好的说明: 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");
}

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


我在上面的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();
}


最后,我的问题:

  1. 是否有更好的方法将两个日期之间的差异转换为“社交”字符串格式?正如我所说,我感觉可能可以使用一些其他方式,比如扩展 DateFormat 对象,但我不确定。

  2. 如何本地化诸如“昨天”“在”这样的字符串,以使不同的 Local 设置将字符串更改为适当的语言?


对于这么长的问题,非常抱歉,但我找不到更短的解释方式。
谢谢

1个回答

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”

非常有趣,看起来就是我在寻找的。我会检查这个库的。谢谢! - sromku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接