我试图实现一个类似于“社交”日期格式的功能。我已经有了一个解决方案,但感觉应该存在更好的解决方案。为什么要使用“社交”(social)这个词,我指的是:
如果我们看一下 Facebook 上的帖子时间戳,可以区分以下选项:
- X 秒前
- X 分钟前
- X 小时前
- 昨天上午 11:07
- 上周五晚上 9:36
- 5月5日下午 5:00
- 2012年11月20日晚上 9:05
我制作了下面这张可视化时间轴以进行更好的说明:
例如:
如果当前时间是:
星期三下午 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();
}
最后,我的问题:
是否有更好的方法将两个日期之间的差异转换为“社交”字符串格式?正如我所说,我感觉可能可以使用一些其他方式,比如扩展
DateFormat
对象,但我不确定。如何本地化诸如“昨天”和“在”这样的字符串,以使不同的
Local
设置将字符串更改为适当的语言?
对于这么长的问题,非常抱歉,但我找不到更短的解释方式。
谢谢