11

「ソーシャル」日付形式としましょう。私はすでに解決策を持っていますが、より良い解決策が存在するべきだと感じています。ソーシャルな理由と意味:

投稿の Facebook タイムスタンプを調べると、次のオプションを区別できます。

  1. X 秒前
  2. X分前
  3. X時間前
  4. 昨日午前11時7分
  5. 金曜日の午後 9 時 36 分
  6. 5月5日午後5時
  7. 2012 年 11 月 20 日午後 9 時 5 分

説明をわかりやすくするために、次の視覚的なタイムラインを作成しました。 ここに画像の説明を入力
たとえば
、現在の時刻が次の場合: 水曜日の午後 5 時 33 分、水曜日の 20 秒
ソーシャル投稿は、火曜日の午前 0 時<-->午後 5 時 33 分、火曜日の20 秒の間に発生しました。
日付形式は次のようになります:昨日の午前 11:07

私が持っている解決策
各オプション(カウントで7)をチェックし、「ソーシャル」日付文字列を返します。

これは、オプション 1を確認する方法です。

Date postDate = getPostDate();
Date nowDate = getNowDate();

// check passed seconds
int passedSeconds = getPassedSeconds(postDate, nowDate);
if (passedSeconds < 60)
{
    return passedSeconds + " seconds ago";
} 

これは、オプション 4を確認する方法です。

// check yesterday
Date startYesterdayDate = getZeroDayBeforeDays(nowDate, 1);
int compare = compare(startYesterdayDate, postDate);

// if postDate comes after startYesterdayDate
if (compare == -1)
{
    return "Yesterday at " + getString(postDate, "HH:mma");
}

他のオプションも同様にチェックします。


上記のifステートメントで使用するいくつかの方法:

public static String getString(Date date, String format)
{
    Format formatter = new SimpleDateFormat(format, Locale.US);
    String s = formatter.format(date);
    return s;
}

/**
 * For example: today - 1 day
 * 
 * @param date
 * @param numOfMinusDays
 * @return
 */
public static Date getDateMinusDays(Date date, int numOfMinusDays)
{
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.DAY_OF_MONTH, (0 - numOfMinusDays));
    return calendar.getTime();
}

/**
 * Get the day before today at 00:00 am.<br>
 * Means, if passed day = <b>Nov 5 13:04</b>, then returned date will be = <b>Nov 4 00:00</b> for days = 1
 * 
 * @param date
 * @param days Numner of days to reduce
 * @return
 */
public static Date getZeroDayBeforeDays(Date date, int days)
{
    Calendar yesterday = Calendar.getInstance();
    yesterday.setTime(getDateMinusDays(date, days));
    yesterday.set(Calendar.HOUR_OF_DAY, 0);
    yesterday.set(Calendar.MINUTE, 0);
    yesterday.set(Calendar.SECOND, 0);
    yesterday.set(Calendar.MILLISECOND, 1);
    return yesterday.getTime();
}


最後に、私の質問:

  1. 2 つの日付の違いを「ソーシャル」文字列形式に変換するより良い方法はありますか? 私が言ったように、おそらくDateFormatオブジェクトを拡張するような他の方法を使用できると思いますが、よくわかりません。

  2. 'Yesterday''at'などの文字列をローカライズして、異なるLocalセットが文字列を適切な言語に変更する方法は?


非常に長い質問で申し訳ありませんが、必要性を説明する短い方法が見つかりませんでした。
ありがとう

4

1 に答える 1

3

ホイールを再発明したくない場合は、そのために実装されたライブラリが既に1つあります

を参照PrettyTimeしてください。ローカリゼーション サポートあり

PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
//prints: “right now”

System.out.println(p.format(new Date(1000*60*10)));
//prints: “10 minutes from now”
于 2013-06-02T19:33:35.177 に答える