(转)优雅的微博时间显示接口(Java实现)
今天继续摆弄了一下 Weibo 开放平台,发现获取到的博文发表时间是时间戳,这个处理就不说了,今天要说的是,想跟官方微博显示一样的“刚刚”,“5秒前”,“25分钟前”,“2小时前”,“昨天”,“2天前”。展示出这样的时间显示方式给大家。
先来看一下我效果预览图:
其实处理时相当简单额,今天我就在这里为大家展示Java的实现方式。
首先创建一个getFarmatTime方法,供后面时间处理的时候使用。
- /**
- * Description:<code> 返回指定格式的Date </code> By 天琪 at 2012-10-30 下午6:22:12
- * String
- *
- * @param date
- * @param Sdf
- * @return
- * @throws
- */
- public static String getFormatTime(Date date, String Sdf) {
- return (new SimpleDateFormat(Sdf)).format(date);
- }
接下来就是对获取到时间戳做一个处理:
- // 得到两个时间之前的毫秒差 ,其中creatAt是从Weibo 接口获取到时间戳,为Linux时间戳,为DataTime类型。
- long millisecond = new Date().getTime() - createAt.getTime();
- long second = millisecond / 1000; // 转换为秒
- // 判断,如果返回的时间差小于等于0秒,则赋值为0
- if (second <= 0) {
- second = 0;
- }
经过上面一些处理过后,我们的时间已经转换为秒了,这样更加便于后面的处理。
下面的便是核心处理代码了:
- // 注意这里传递的second,已经在上面一步转换为(秒)了
- if (second == 0) {
- // 如果等于0秒,显示刚刚。
- interval = "刚刚";
- } else if (second < 30) {
- // 小于30秒,则显示为second秒以前。
- interval = second + "秒以前";
- } else if (second >= 30 && second < 60) {
- // 大于30秒,小于60秒,则显示为“半分钟前”。
- interval = "半分钟前";
- } else if (second >= 60 && second < 60 * 60) {
- // 大于60秒,小于一个小时(60*60),则将秒数换算分钟数,显示多少分钟以前。
- long minute = second / 60;
- interval = minute + "分钟前";
- } else if (second >= 60 * 60 && second < 60 * 60 * 24) {
- // 大于一个小时,小于1天(60*60*24),则将秒数转化成小时。
- long hour = (second / 60) / 60;
- // 如果小于3个小时,则显示 “hour小时前”。
- if (hour <= 3) {
- interval = hour + "小时前";
- } else {
- // 否则显示“今天 hh:mm”,显示今天具体小时和分钟数。
- interval = "今天" + getFormatTime(createAt, "hh:mm");
- }
- } else if (second >= 60 * 60 * 24 && second <= 60 * 60 * 24 * 2) {
- // 大于一点,小于两天的,则表示是昨天发表的,显示为“昨天”,加上具体的时间。
- interval = "昨天" + getFormatTime(createAt, "hh:mm");
- } else if (second >= 60 * 60 * 24 * 2 && second <= 60 * 60 * 24 * 7) {
- // 大于两天,小于7天的,则将秒数转换为天数,直接显示多少天前。
- long day = ((second / 60) / 60) / 24;
- interval = day + "天前";
- } else if (second >= 60 * 60 * 24 * 7) {
- // 如果时间大于7天,则直接显示具体月份日期和时间,格式为:月-日 时:分(MM-dd hh:mm)
- interval = getFormatTime(createAt, "MM-dd hh:mm");
- } else if (second >= 60 * 60 * 24 * 365) {
- // 如果时间大于一年(365天),则需要在上一个条件的基础上加上年,显示为:年-月-日 时:分(YYYY-MM-dd hh:mm)
- interval = getFormatTime(createAt, "YYYY-MM-dd hh:mm");
- } else {
- // 避免出现时间异常,不再上面的条件之类的时间,全部赋值为0.
- interval = "0";
- }
是不是相当简单呢,我在代码的时间转换上面采用了分离规则来计算,全部采用时间换算率,便于大家理解,例如60*60则是一个小时,60*60*24,则是一天,60*60*24*3,则是3天,以此类推,这样是不是更加便于大家理解呢。
好了,接下来,给大家贴上实现类完整的实现方法:
- /**
- * Description:<code> 处理微博过去时间显示效果 </code> By 古木天琪 at 2012-10-30 下午5:16:37
- * @param createAt
- * Data 类型
- * @return { String }
- * @throws
- */
- public static String getInterval(Date createAt) {
- //定义最终返回的结果字符串。
- String interval = null;
- long millisecond = new Date().getTime() - createAt.getTime();
- long second = millisecond / 1000;
- if (second <= 0) {
- second = 0;
- }
- if (second == 0) {
- interval = "刚刚";
- } else if (second < 30) {
- interval = second + "秒以前";
- } else if (second >= 30 && second < 60) {
- interval = "半分钟前";
- } else if (second >= 60 && second < 60 * 60) {
- long minute = second / 60;
- interval = minute + "分钟前";
- } else if (second >= 60 * 60 && second < 60 * 60 * 24) {
- long hour = (second / 60) / 60;
- if (hour <= 3) {
- interval = hour + "小时前";
- } else {
- interval = "今天" + getFormatTime(createAt, "hh:mm");
- }
- } else if (second >= 60 * 60 * 24 && second <= 60 * 60 * 24 * 2) {
- interval = "昨天" + getFormatTime(createAt, "hh:mm");
- } else if (second >= 60 * 60 * 24 * 2 && second <= 60 * 60 * 24 * 7) {
- long day = ((second / 60) / 60) / 24;
- interval = day + "天前";
- } else if (second >= 60 * 60 * 24 * 7) {
- interval = getFormatTime(createAt, "MM-dd hh:mm");
- } else if (second >= 60 * 60 * 24 * 365) {
- interval = getFormatTime(createAt, "YYYY-MM-dd hh:mm");
- } else {
- interval = "0";
- }
- // 最后返回处理后的结果。
- return interval;
- }
这样的过去时间显示风格,是不是很优雅了,实现方式也是很优雅的。当然这不是唯一的实现方式,欢迎有兴趣的朋友来补充,共同讨论,共同进步哦,如果正在做微博类应用的朋友,或者需要使用过去时间显示风格的朋友,可以直接拿过去使用,很是方便的工具类。