【问题标题】:Custom format for relative time span相对时间跨度的自定义格式
【发布时间】:2013-10-24 21:34:46
【问题描述】:

我正在尝试创建一种自定义格式来显示经过的时间。

现在我正在使用:

CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(
     dateObject.getTime(), 
     System.currentTimeMillis(), 
     DateUtils.SECOND_IN_MILLIS,
     flags);

这会返回像这样的相对时间跨度:

  • 1 分钟前
  • 36 分钟前
  • 4 小时前

...

我想要做的是显示这个,像这样:

  • 1m
  • 36m
  • 4 小时

...

我知道 DateUtils 有 FORMAT_ABBREV_ALL 标志,但这并没有像我想要的那样缩写字符串......

我怎样才能为此创建一些自定义的东西?

【问题讨论】:

    标签: android date format


    【解决方案1】:

    我已经在我的推特模块中完成了这项工作

    public static String getTimeString(Date fromdate) {
    
        long then;
        then = fromdate.getTime();
        Date date = new Date(then);
    
        StringBuffer dateStr = new StringBuffer();
    
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        Calendar now = Calendar.getInstance();
    
        int days = daysBetween(calendar.getTime(), now.getTime());
        int minutes = hoursBetween(calendar.getTime(), now.getTime());
        int hours = minutes / 60;
        if (days == 0) {
    
            int second = minuteBetween(calendar.getTime(), now.getTime());
            if (minutes > 60) {
    
                if (hours >= 1 && hours <= 24) {
                    dateStr.append(hours).append("h");
                }
    
            } else {
    
                if (second <= 10) {
                    dateStr.append("Now");
                } else if (second > 10 && second <= 30) {
                    dateStr.append("few seconds ago");
                } else if (second > 30 && second <= 60) {
                    dateStr.append(second).append("s");
                } else if (second >= 60 && minutes <= 60) {
                    dateStr.append(minutes).append("m");
                }
            }
        } else
    
        if (hours > 24 && days <= 7) {
            dateStr.append(days).append("d");
        } else {
            dateStr.append(twtimeformat.format(date));
        }
    
        return dateStr.toString();
    }
    
    public static int minuteBetween(Date d1, Date d2) {
        return (int) ((d2.getTime() - d1.getTime()) / DateUtils.SECOND_IN_MILLIS);
    }
    
    public static int hoursBetween(Date d1, Date d2) {
        return (int) ((d2.getTime() - d1.getTime()) / DateUtils.MINUTE_IN_MILLIS);
    }
    
    public static int daysBetween(Date d1, Date d2) {
        return (int) ((d2.getTime() - d1.getTime()) / DateUtils.DAY_IN_MILLIS);
    }
    

    【讨论】:

    • 谢谢。最后我实现了类似的东西。如果有一种更简单的方法,比如我的问题中的方法,但后面有一些定制,我会更喜欢。仍然是一个很好的答案。我会将其标记为解决方案。
    【解决方案2】:

    像这样创建一个获取日期差异的方法

    public static String getDateDifferenceForDisplay(Date inputdate) {
        Calendar now = Calendar.getInstance();
        Calendar then = Calendar.getInstance();
    
        now.setTime(new Date());
        then.setTime(inputdate);
    
        // Get the represented date in milliseconds
        long nowMs = now.getTimeInMillis();
        long thenMs = then.getTimeInMillis();
    
        // Calculate difference in milliseconds
        long diff = nowMs - thenMs;
    
        // Calculate difference in seconds
        long diffMinutes = diff / (60 * 1000);
        long diffHours = diff / (60 * 60 * 1000);
        long diffDays = diff / (24 * 60 * 60 * 1000);
    
        if (diffMinutes < 60) {
            return diffMinutes + " m";
    
        } else if (diffHours < 24) {
            return diffHours + " h";
    
        } else if (diffDays < 7) {
            return diffDays + " d";
    
        } else {
    
            SimpleDateFormat todate = new SimpleDateFormat("MMM dd",
                    Locale.ENGLISH);
    
            return todate.format(inputdate);
        }
    } 
    

    那你就可以这样称呼了

    String dateForDisplay = getDateDifferenceForDisplay(inputDate);
    

    【讨论】:

      【解决方案3】:

      对此没有内置的方法/实用程序,但是使用可用的DateUtils 常量来实现它非常简单:

      private static final String ABBR_YEAR = "y";
      private static final String ABBR_WEEK = "w";
      private static final String ABBR_DAY = "d";
      private static final String ABBR_HOUR = "h";
      private static final String ABBR_MINUTE = "m";
      
      public static String getAbbreviatedTimeSpan(long timeMillis) {
          long span = Math.max(System.currentTimeMillis() - timeMillis, 0);
          if (span >= DateUtils.YEAR_IN_MILLIS) {
              return (span / DateUtils.YEAR_IN_MILLIS) + ABBR_YEAR;
          }
          if (span >= DateUtils.WEEK_IN_MILLIS) {
              return (span / DateUtils.WEEK_IN_MILLIS) + ABBR_WEEK;
          }
          if (span >= DateUtils.DAY_IN_MILLIS) {
              return (span / DateUtils.DAY_IN_MILLIS) + ABBR_DAY;
          }
          if (span >= DateUtils.HOUR_IN_MILLIS) {
              return (span / DateUtils.HOUR_IN_MILLIS) + ABBR_HOUR;
          }
          return (span / DateUtils.MINUTE_IN_MILLIS) + ABBR_MINUTE;
      }
      

      【讨论】:

      • 这很好,除了提前一天! .知道这是为什么吗??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多