“检查时间”;“以前”;在Jodatime或java.util.Date中

“检查时间”;“以前”;在Jodatime或java.util.Date中,java,android,datetime,jodatime,Java,Android,Datetime,Jodatime,我想展示一下事情发生的时间。比如说 24分钟前//放弃秒数 3小时前//放弃分钟 5天前//4小时 三周前//三天 我只有一个长时间戳,因此我可以自由地使用java.util.Date或jodatime或android使用的任何其他Time。我很难把它做好。我试着用jodatime加上减号,但我还不能得到正确的答案 一种方法是让我自己做整个事情:首先从现在开始减去我的时间戳,然后做一些算术。但如果可能的话,我宁愿避免这条路线。您可以使用以下代码: public class TimeAg

我想展示一下事情发生的时间。比如说

  • 24分钟前//放弃秒数
  • 3小时前//放弃分钟
  • 5天前//4小时
  • 三周前//三天
我只有一个
长时间戳
,因此我可以自由地使用
java.util.Date
jodatime
或android使用的任何其他
Time。我很难把它做好。我试着用jodatime加上
减号
,但我还不能得到正确的答案


一种方法是让我自己做整个事情:首先从现在开始减去我的时间戳,然后做一些算术。但如果可能的话,我宁愿避免这条路线。

您可以使用以下代码:

   public class TimeAgo {
    public static final List<Long> times = Arrays.asList(
            TimeUnit.DAYS.toMillis(365),
            TimeUnit.DAYS.toMillis(30),
            TimeUnit.DAYS.toMillis(1),
            TimeUnit.HOURS.toMillis(1),
            TimeUnit.MINUTES.toMillis(1),
            TimeUnit.SECONDS.toMillis(1) );
    public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second");

    public static String toDuration(long duration) {

        StringBuffer res = new StringBuffer();
        for(int i=0;i< Lists.times.size(); i++) {
            Long current = Lists.times.get(i);
            long temp = duration/current;
            if(temp>0) {
                res.append(temp).append(" ").append( Lists.timesString.get(i) ).append(temp > 1 ? "s" : "").append(" ago");
                break;
            }
        }
        if("".equals(res.toString()))
            return "0 second ago";
        else
            return res.toString();
    }
}
公共类时间间隔{
公共静态最终列表时间=Arrays.asList(
时间单位。天。托米利斯(365),
时间单位。天。托米利斯(30),
时间单位。天。托米利斯(1),
时间单位。小时。托米利斯(1),
时间单位。分钟。托米利斯(1),
时间单位。秒。托米利斯(1));
公共静态最终列表timestring=Arrays.asList(“年”、“月”、“日”、“小时”、“分钟”、“秒”);
公共静态字符串toDuration(长持续时间){
StringBuffer res=新的StringBuffer();
对于(int i=0;i0){
res.append(temp.append(“”).append(Lists.timestring.get(i)).append(temp>1?“s”:“”).append(“ago”);
打破
}
}
如果(“.”等于(res.toString())
返回“0秒前”;
其他的
return res.toString();
}
}
只需使用长时间戳作为参数调用
toDuration()
方法


您还可以使用
DateUtils.getRelativeTimeSpanString()
。您可以阅读此处的文档

Android为所有此类需求提供了实用程序类
DateUtils
。如果我正确理解了您的需求,您需要使用实用方法

从文档中获取

CharSequence getRelativeTimeSpanString(长时间、长现在、长最小分辨率)

返回一个字符串,该字符串将“time”描述为相对于“now”的时间。过去的时间跨度格式为“42分钟前”。未来的时间跨度格式为“42分钟内”

您将以
time
System.currentTimeMillis()的形式传递
timestamp
as
now
minResolution
指定要报告的最小时间跨度

例如,如果将过去3秒的时间设置为分钟(单位:毫秒),则该时间将报告为“0分钟前”。通过0中的一个,以分钟为单位,以小时为单位,以天为单位,以周为单位


有一个PrettyTime API,有一个快速的谷歌搜索,一年中没有365天,一个月中也没有30天,这不会有太大的区别。无论如何,OP显示的是大约“以前”的时间。所以这不会有多大区别。顺便说一句,您可以始终使用DateUtils#getRelativeTimeSpanString(),这取决于您如何使用该算法,时间越长,情况就越糟,因为有更好的机制随时可用,它所做的只是传播了一个坏主意-我对日期/时间计算非常挑剔;)我想这就是我寻求的答案。不幸的是,另一个bug正在阻止我现在验证答案;慢慢来,伙计。我在这里,以防你需要任何进一步的帮助,在这个方法。