1

4週間前と1ヶ月前の見分け方 Androidでテストコードを書いたときに問題が発生しました。

検査した日によると思います。私は正しいと思いますか?私の意見が正しければ、どうすればうまくいくか、テストコードに合格できますか?

テスト コードに合格するための私のアイデアの 1 つは、テストの日付を保持することです。何かアイデアはありますか?


申し訳ありませんが、私の質問は明確ではないと思います。私のコードの一部はここにあります。

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代わりに期待していたからです。私のコードが間違っているのだろうか、それとも問題は週の長さに依存しているので、それは自然な問題なのだろうか?

4

3 に答える 3

0

以下の関数を取得します。

  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";
  }
 }

アップデート

私の別の機能を使用できます:

  public static String getTimeAgo(long time) {
     if (time < 1000000000000L) {
     // if timestamp given in seconds, convert to millis
     time *= 1000;
  }

  long now = System.currentTimeMillis();
  if (time > now || time <= 0) {
     return null;
  }

  // TODO: localize
  final long diff = now - time;
  if (diff < MINUTE_MILLIS) {
     return "just now";
  } else if (diff < 2 * MINUTE_MILLIS) {
     return "a minute ago";
  } else if (diff < 50 * MINUTE_MILLIS) {
     return diff / MINUTE_MILLIS + " min ago";
  } else if (diff < 90 * MINUTE_MILLIS) {
     return "an hour ago";
  } else if (diff < 24 * HOUR_MILLIS) {
     return diff / HOUR_MILLIS + " hours ago";
  } else if (diff < 48 * HOUR_MILLIS) {
     return "yesterday";
  } else {
     return diff / DAY_MILLIS + " days ago";
  }
 }
于 2016-12-26T07:46:07.687 に答える
0

私は何が問題なのかを理解しています。月の曜日によって異なります。

月の日は同じではありません (10 月 31 日、11 月 30 日、12 月 31 日 ..) ですが、コードで計算するときに定数を使用しています。

つまり、月に 31 日ある場合、コード内の sinceNowInMillis は MONTH_UNIT 未満です。したがって、結果は私のコードに従って「4週間前」です。Calendar.add(Calender.MONTH, -1) を使用して目標の日付を計算したためです。

一方、月が 30 日以下の場合、コード内の NowInMillis は MONTH_UNIT より大きくなります。したがって、結果は私のコードに従って「1か月前」になります。

于 2016-12-26T14:15:53.623 に答える