zoukankan      html  css  js  c++  java
  • (转)优雅的微博时间显示接口(Java实现)


    现在的位置: 首页 > 编程语言 > Java > 正文
     
    优雅的微博时间显示接口(Java实现)
    2012年11月05日 ⁄ JavaM5原创编程语言 ⁄ 共 4745字 ⁄ 暂无评论

    今天继续摆弄了一下 Weibo 开放平台,发现获取到的博文发表时间是时间戳,这个处理就不说了,今天要说的是,想跟官方微博显示一样的“刚刚”,“5秒前”,“25分钟前”,“2小时前”,“昨天”,“2天前”。展示出这样的时间显示方式给大家。


    先来看一下我效果预览图:

    优雅的微博时间显示

    其实处理时相当简单额,今天我就在这里为大家展示Java的实现方式。

    首先创建一个getFarmatTime方法,供后面时间处理的时候使用。

     
    1. /**  
    2.      * Description:<code> 返回指定格式的Date </code> By 天琪 at 2012-10-30 下午6:22:12  
    3.      * String  
    4.      *   
    5.      * @param date  
    6.      * @param Sdf  
    7.      * @return  
    8.      * @throws  
    9.      */  
    10.     public static String getFormatTime(Date date, String Sdf) {   
    11.         return (new SimpleDateFormat(Sdf)).format(date);   
    12.     }  

     接下来就是对获取到时间戳做一个处理:

     
    1. // 得到两个时间之前的毫秒差 ,其中creatAt是从Weibo 接口获取到时间戳,为Linux时间戳,为DataTime类型。
    2. long millisecond = new Date().getTime() - createAt.getTime();   
    3.   
    4. long second = millisecond / 1000// 转换为秒   
    5.   
    6. // 判断,如果返回的时间差小于等于0秒,则赋值为0   
    7. if (second <= 0) {   
    8.     second = 0;   
    9. }  

    经过上面一些处理过后,我们的时间已经转换为秒了,这样更加便于后面的处理。

    下面的便是核心处理代码了:

     
    1. // 注意这里传递的second,已经在上面一步转换为(秒)了   
    2.   
    3.         if (second == 0) {   
    4.             // 如果等于0秒,显示刚刚。   
    5.             interval = "刚刚";   
    6.         } else if (second < 30) {   
    7.             // 小于30秒,则显示为second秒以前。   
    8.             interval = second + "秒以前";   
    9.         } else if (second >= 30 && second < 60) {   
    10.             // 大于30秒,小于60秒,则显示为“半分钟前”。   
    11.             interval = "半分钟前";   
    12.         } else if (second >= 60 && second < 60 * 60) {   
    13.             // 大于60秒,小于一个小时(60*60),则将秒数换算分钟数,显示多少分钟以前。   
    14.             long minute = second / 60;   
    15.             interval = minute + "分钟前";   
    16.         } else if (second >= 60 * 60 && second < 60 * 60 * 24) {   
    17.             // 大于一个小时,小于1天(60*60*24),则将秒数转化成小时。   
    18.             long hour = (second / 60) / 60;   
    19.             // 如果小于3个小时,则显示 “hour小时前”。   
    20.             if (hour <= 3) {   
    21.                 interval = hour + "小时前";   
    22.             } else {   
    23.                 // 否则显示“今天 hh:mm”,显示今天具体小时和分钟数。   
    24.                 interval = "今天" + getFormatTime(createAt, "hh:mm");   
    25.             }   
    26.         } else if (second >= 60 * 60 * 24 && second <= 60 * 60 * 24 * 2) {   
    27.             // 大于一点,小于两天的,则表示是昨天发表的,显示为“昨天”,加上具体的时间。   
    28.             interval = "昨天" + getFormatTime(createAt, "hh:mm");   
    29.         } else if (second >= 60 * 60 * 24 * 2 && second <= 60 * 60 * 24 * 7) {   
    30.             // 大于两天,小于7天的,则将秒数转换为天数,直接显示多少天前。   
    31.             long day = ((second / 60) / 60) / 24;   
    32.             interval = day + "天前";   
    33.         } else if (second >= 60 * 60 * 24 * 7) {   
    34.             // 如果时间大于7天,则直接显示具体月份日期和时间,格式为:月-日 时:分(MM-dd hh:mm)   
    35.             interval = getFormatTime(createAt, "MM-dd hh:mm");   
    36.         } else if (second >= 60 * 60 * 24 * 365) {   
    37.             // 如果时间大于一年(365天),则需要在上一个条件的基础上加上年,显示为:年-月-日 时:分(YYYY-MM-dd hh:mm)   
    38.             interval = getFormatTime(createAt, "YYYY-MM-dd hh:mm");   
    39.         } else {   
    40.             // 避免出现时间异常,不再上面的条件之类的时间,全部赋值为0.   
    41.             interval = "0";   
    42.         }   

    是不是相当简单呢,我在代码的时间转换上面采用了分离规则来计算,全部采用时间换算率,便于大家理解,例如60*60则是一个小时,60*60*24,则是一天,60*60*24*3,则是3天,以此类推,这样是不是更加便于大家理解呢。

    好了,接下来,给大家贴上实现类完整的实现方法:

     
    1. /**  
    2.      * Description:<code> 处理微博过去时间显示效果 </code> By 古木天琪 at 2012-10-30 下午5:16:37  
    3.      * @param createAt  
    4.      *            Data 类型  
    5.      * @return { String }
    6.      * @throws  
    7.      */  
    8.     public static String getInterval(Date createAt) {   
    9.         //定义最终返回的结果字符串。   
    10.         String interval = null;   
    11.   
    12.         long millisecond = new Date().getTime() - createAt.getTime();   
    13.   
    14.         long second = millisecond / 1000;
    15.   
    16.         if (second <= 0) {   
    17.             second = 0;   
    18.         }   
    19.   
    20.         if (second == 0) {   
    21.             interval = "刚刚";   
    22.         } else if (second < 30) {   
    23.             interval = second + "秒以前";   
    24.         } else if (second >= 30 && second < 60) {   
    25.             interval = "半分钟前";   
    26.         } else if (second >= 60 && second < 60 * 60) {   
    27.             long minute = second / 60;   
    28.             interval = minute + "分钟前";   
    29.         } else if (second >= 60 * 60 && second < 60 * 60 * 24) {   
    30.             long hour = (second / 60) / 60;   
    31.             if (hour <= 3) {   
    32.                 interval = hour + "小时前";   
    33.             } else {   
    34.                 interval = "今天" + getFormatTime(createAt, "hh:mm");   
    35.             }   
    36.         } else if (second >= 60 * 60 * 24 && second <= 60 * 60 * 24 * 2) {   
    37.             interval = "昨天" + getFormatTime(createAt, "hh:mm");   
    38.         } else if (second >= 60 * 60 * 24 * 2 && second <= 60 * 60 * 24 * 7) {   
    39.             long day = ((second / 60) / 60) / 24;   
    40.             interval = day + "天前";   
    41.         } else if (second >= 60 * 60 * 24 * 7) {   
    42.             interval = getFormatTime(createAt, "MM-dd hh:mm");   
    43.         } else if (second >= 60 * 60 * 24 * 365) {   
    44.             interval = getFormatTime(createAt, "YYYY-MM-dd hh:mm");   
    45.         } else {   
    46.             interval = "0";   
    47.         }   
    48.         // 最后返回处理后的结果。   
    49.         return interval;   
    50.     }  

    这样的过去时间显示风格,是不是很优雅了,实现方式也是很优雅的。当然这不是唯一的实现方式,欢迎有兴趣的朋友来补充,共同讨论,共同进步哦,如果正在做微博类应用的朋友,或者需要使用过去时间显示风格的朋友,可以直接拿过去使用,很是方便的工具类。

  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/greywolf/p/2943108.html
Copyright © 2011-2022 走看看