像youtube一样实现了

时间:2016-12-26 07:39:17

标签: android timeago

如何区分4周前和1个月前?当我在android上编写测试代码时,我遇到了问题。

我认为这取决于我测试的日期。我认为对吗?如果我的意见是对的,那么我怎样才能做好或传递测试代码?

我传递测试代码的想法之一就是暂时保留测试日期。对我有什么想法吗?

抱歉,我认为我的问题不明确。我的代码的一部分就在这里。

assertEquals("a month ago", timeAgoWithAddedValue(Calendar.MONTH, -1));

private String timeAgoWithAddedValue(int field, int value) {
    Calendar cal = Calendar.getInstance();
    cal.add(field, value);
    return timeAgo(cal.getTime());
}

public static final long WEEK_UNIT = DAY_UNIT * 7;
public static final long MONTH_UNIT = 2629746000L; // I found this value online, 1 Gregorian month -> ms
public static final long YEAR_UNIT = 31556952000L; // I found this value online, 1 Gregorian year -> ms

public String timeAgo(Date date) {
        long now = Calendar.getInstance().getTimeInMillis();
        long sinceNowInMillis = now - date.getTime();

        ...
        if (sinceNowInMillis < MONTH_UNIT) {
            long weeks = sinceNowInMillis / WEEK_UNIT;
            // return proper ago string with weeks
        }

        if (sinceNowInMillis < YEAR_UNIT) {
            long months = sinceNowInMillis / MONTH_UNIT;
            // return proper ago string with months
        }
        ...
}

我几个月前编写了代码,当时它成功了。但今天测试代码失败了。因为代码期望4 weeks ago。我不知道我的代码是错的还是问题取决于周长,所以它是自然问题?

3 个答案:

答案 0 :(得分:0)

获得以下功能:

json
[[1]]
[[1]]$politics
[[1]]$politics[[1]]
[[1]]$politics[[1]]$type
[1] "admin2"

[[1]]$politics[[1]]$friendly_type
[1] "country"

[[1]]$politics[[1]]$name
[1] "Kazakhstan"

[[1]]$politics[[1]]$code
[1] "kaz"


[[1]]$politics[[2]]
[[1]]$politics[[2]]$type
[1] "admin4"

[[1]]$politics[[2]]$friendly_type
[1] "state"

[[1]]$politics[[2]]$name
[1] "West Kazakhstan"

[[1]]$politics[[2]]$code
[1] "kz07"

[[1]]$location
[[1]]$location$latitude
[1] 51

[[1]]$location$longitude
[1] 53

<强>更新

你可以使用我的另一个功能:

  public static String millisToLongDHMS(long duration) {
  if (duration > 0) {
     duration = new Date().getTime() - duration;
  }
  if (duration < 0) {
     duration = 0;
  }

  StringBuffer res = new StringBuffer();
  long temp = 0;
  if (duration >= ONE_SECOND) {
     temp = duration / ONE_DAY;
     if (temp > 0) {
        duration -= temp * ONE_DAY;
        res.append(temp).append(" day").append(temp > 1 ? "s" : "")
                .append(duration >= ONE_MINUTE ? ", " : "");
     }

     temp = duration / ONE_HOUR;
     if (temp > 0) {
        duration -= temp * ONE_HOUR;
        res.append(temp).append(" hour").append(temp > 1 ? "s" : "")
                .append(duration >= ONE_MINUTE ? ", " : "");
     }

     temp = duration / ONE_MINUTE;
     if (temp > 0) {
        duration -= temp * ONE_MINUTE;
        res.append(temp).append(" min").append(temp > 1 ? "s" : "");
     }

     if (!res.toString().equals("") && duration >= ONE_SECOND) {
        res.append(" and ");
     }

     temp = duration / ONE_SECOND;
     if (temp > 0) {
        res.append(temp).append(" sec").append(temp > 1 ? "s" : "");
     }
     res.append(" ago");
     return res.toString();
  } else {
     return "Just Now";
  }
 }

答案 1 :(得分:0)

您可以使用此行代码来实现您的目标,而无需在项目中使用任何库

 DateUtils.getRelativeTimeSpanString(timestamp, new Date().getTime(), DateUtils.MINUTE_IN_MILLIS)

这里timestamp是一段很长的时间

在此处的文档DateUtils

中阅读更多内容

例如如果您将时间戳传递为1482739673913,您将获得6 minutes ago

如果时间戳为1482582128877,您将获得2 days ago

答案 2 :(得分:0)

我弄清楚问题是什么。这取决于每月的日子。

月份的日子不一样(10月31日,11月30日,12月31日......)但是当我在我的代码中计算它时,我正在使用常数。

我的意思是,如果月份有31天,那么因为我的代码中的NowInMillis小于MONTH_UNIT。结果是'4周前'跟随我的代码。因为我使用Calendar.add(Calender.MONTH,-1)计算了目标日期。

另一方面,如果月份有30天或更少,则因为我的代码中的NowInMillis大于MONTH_UNIT。所以结果是'1个月前'跟随我的代码。