转自:https://www.cnblogs.com/devise/p/9974672.html

我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示xxx之前回复),我们可以在后端进行处理,也可以在前端进行处理,这里讲讲在后端进行处理的方法.

其实很简单,我们只需要将从数据库中取到的date类型的字段进行处理。

工具类如下:

 

 

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 * 传入一个 2018-06-01 18:35:35 格式的日期对象,通过TimeAgoUtils.format方法,多少秒前、多少天前的字符串
 * 
 *
 */
public class TimeAgoUtils {

   private static final long ONE_MINUTE = 60000L;
   private static final long ONE_HOUR = 3600000L;
   private static final long ONE_DAY = 86400000L;
   private static final long ONE_WEEK = 604800000L;

   private static final String ONE_SECOND_AGO = "秒前";
   private static final String ONE_MINUTE_AGO = "分钟前";
   private static final String ONE_HOUR_AGO = "小时前";
   private static final String ONE_DAY_AGO = "天前";
   private static final String ONE_MONTH_AGO = "月前";
   private static final String ONE_YEAR_AGO = "年前";

   public static String format(Date date) {
      long delta = new Date().getTime() - date.getTime();
      if (delta < 1L * ONE_MINUTE) {
         long seconds = toSeconds(delta);
         return (seconds <= 0 ? 1 : seconds) + ONE_SECOND_AGO;
      }
      if (delta < 45L * ONE_MINUTE) {
         long minutes = toMinutes(delta);
         return (minutes <= 0 ? 1 : minutes) + ONE_MINUTE_AGO;
      }
      if (delta < 24L * ONE_HOUR) {
         long hours = toHours(delta);
         return (hours <= 0 ? 1 : hours) + ONE_HOUR_AGO;
      }
      if (delta < 48L * ONE_HOUR) {
         return "昨天";
      }
      if (delta < 30L * ONE_DAY) {
         long days = toDays(delta);
         return (days <= 0 ? 1 : days) + ONE_DAY_AGO;
      }
      if (delta < 12L * 4L * ONE_WEEK) {
         long months = toMonths(delta);
         return (months <= 0 ? 1 : months) + ONE_MONTH_AGO;
      } else {
         long years = toYears(delta);
         return (years <= 0 ? 1 : years) + ONE_YEAR_AGO;
      }
   }

   private static long toSeconds(long date) {
      return date / 1000L;
   }

   private static long toMinutes(long date) {
      return toSeconds(date) / 60L;
   }

   private static long toHours(long date) {
      return toMinutes(date) / 60L;
   }

   private static long toDays(long date) {
      return toHours(date) / 24L;
   }

   private static long toMonths(long date) {
      return toDays(date) / 30L;
   }

   private static long toYears(long date) {
      return toMonths(date) / 365L;
   }

   public static void main(String[] args) throws Exception {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date date = sdf.parse("2018-06-01 18:35:35");
      
      System.out.println(TimeAgoUtils.format(date));
      
      
   }

}

经过了该类的处理之后,得到的全是 "xxx前"  的字符串。我们可以将需要返回到前端的VO类中加入该属性,这样在前端取到数据后就可以进行显示了。

例:

 数据库中的时间:

 

经过工具类进行处理后,在前端显示的格式:

posted on 2019-01-25 02:56  Sharpest  阅读(245)  评论(0编辑  收藏  举报