5

Twitter を解析しています。Twitter が投稿されてからの経過時間を表示したいと考えています。しかし、正しく計算されていないようです。Stackoverflow の別の投稿から数式を取得し、そこから return ステートメントを作成しようとしました。

public static String getTwitterDate(Date date){
    long milliseconds = date.getTime();
    int minutes = (int) ((milliseconds / (1000*60)) % 60);
    int hours   = (int) ((milliseconds / (1000*60*60)) % 24);

    if (hours > 0){
        if (hours == 1)
            return "1 hour ago";
        else if (hours < 24)
            return String.valueOf(hours) + " hours ago";
        else
        {
            int days = (int)Math.ceil(hours % 24);
            if (days == 1)
                return "1 day ago";
            else
                return String.valueOf(days) + " days ago";
        }
    }
    else
    {
        if (minutes == 0)
            return "less than 1 minute ago";
        else if (minutes == 1)
            return "1 minute ago";
        else
            return String.valueOf(minutes) + " minutes ago";
    }
}

これでTwitterの日付/時刻を解析します(これもStackoverflowの投稿から)

public static Date parseTwitterDate(String date)
{
    final String TWITTER = "EEE, dd MMM yyyy HH:mm:ss Z";
    SimpleDateFormat sf = new SimpleDateFormat(TWITTER, Locale.ENGLISH);
    sf.setLenient(true);

    try {
        return sf.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

Twitter の日付の例: "created_at":"Sat, 30 Jun 2012 14:44:40 +0000",

私が知る限り、Twitter は正しく解析されていますが、正しく計算されていません (getTwitterDate)。4〜5時間の差がある場合、11時間を返すことがあります。

4

5 に答える 5

12

DateUtilsを使用します。それは完全にローカライズされており、人間に優しい方法でやりたいことを実行します。

自動的にローカライズされる相対的なタイムスパン式を取得する例を次に示します。

long time = ... // The Twitter post time stamp
long now = System.currentTimeMillis();
CharSequence relativeTimeStr = DateUtils.getRelativeTimeSpanString(time, 
    now, DateUtils.SECOND_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);

「10秒前」や「5分後」などの出力を生成します。

于 2012-06-30T14:59:45.663 に答える
5

long milliseconds = date.getTime() - new Date().getTime();

ツイートの日付と現在の差に基づいて計算が実行されます。

date.getTime()現在、 1970年1月1日の深夜からのミリ秒数に基づいて計算を行っています。モジュロも導入しているため、現在の関数はUTCの午前0時からツイートまでの経過時間を示します。

于 2012-06-30T15:02:07.513 に答える
4

入力変数「timeAtMiliseconds」を変更できます。私の例では、日付の形式はミリ秒でした。

private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static SimpleDateFormat formatterYear = new SimpleDateFormat("MM/dd/yyyy");

public static String parseDate(@NotNull Long timeAtMiliseconds) {
    timeAtMiliseconds *= 1000L; //Check if this is unnecessary for your use

    if (timeAtMiliseconds == 0) {
        return "";
    }

    //API.log("Day Ago "+dayago);
    String result = "now";
    String dataSot = formatter.format(new Date());
    Calendar calendar = Calendar.getInstance();

    long dayagolong = timeAtMiliseconds;
    calendar.setTimeInMillis(dayagolong);
    String agoformater = formatter.format(calendar.getTime());

    Date CurrentDate = null;
    Date CreateDate = null;

    try {
        CurrentDate = formatter.parse(dataSot);
        CreateDate = formatter.parse(agoformater);

        long different = Math.abs(CurrentDate.getTime() - CreateDate.getTime());

        long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;
        long daysInMilli = hoursInMilli * 24;

        long elapsedDays = different / daysInMilli;
        different = different % daysInMilli;

        long elapsedHours = different / hoursInMilli;
        different = different % hoursInMilli;

        long elapsedMinutes = different / minutesInMilli;
        different = different % minutesInMilli;

        long elapsedSeconds = different / secondsInMilli;

        if (elapsedDays == 0) {
            if (elapsedHours == 0) {
                if (elapsedMinutes == 0) {
                    if (elapsedSeconds < 0) {
                        return "0" + " s";
                    } else {
                        if (elapsedSeconds > 0 && elapsedSeconds < 59) {
                            return "now";
                        }
                    }
                } else {
                    return String.valueOf(elapsedMinutes) + "m ago";
                }
            } else {
                return String.valueOf(elapsedHours) + "h ago";
            }

        } else {
            if (elapsedDays <= 29) {
                return String.valueOf(elapsedDays) + "d ago";
            }
            if (elapsedDays > 29 && elapsedDays <= 58) {
                return "1Mth ago";
            }
            if (elapsedDays > 58 && elapsedDays <= 87) {
                return "2Mth ago";
            }
            if (elapsedDays > 87 && elapsedDays <= 116) {
                return "3Mth ago";
            }
            if (elapsedDays > 116 && elapsedDays <= 145) {
                return "4Mth ago";
            }
            if (elapsedDays > 145 && elapsedDays <= 174) {
                return "5Mth ago";
            }
            if (elapsedDays > 174 && elapsedDays <= 203) {
                return "6Mth ago";
            }
            if (elapsedDays > 203 && elapsedDays <= 232) {
                return "7Mth ago";
            }
            if (elapsedDays > 232 && elapsedDays <= 261) {
                return "8Mth ago";
            }
            if (elapsedDays > 261 && elapsedDays <= 290) {
                return "9Mth ago";
            }
            if (elapsedDays > 290 && elapsedDays <= 319) {
                return "10Mth ago";
            }
            if (elapsedDays > 319 && elapsedDays <= 348) {
                return "11Mth ago";
            }
            if (elapsedDays > 348 && elapsedDays <= 360) {
                return "12Mth ago";
            }

            if (elapsedDays > 360 && elapsedDays <= 720) {
                return "1 year ago";
            }

            if (elapsedDays > 720) {
                Calendar calendarYear = Calendar.getInstance();
                calendarYear.setTimeInMillis(dayagolong);
                return formatterYear.format(calendarYear.getTime()) + "";
            }

        }

    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }
    return result;
}

      //USAGE
    Log.d("TAG Pretty date: ", parseDate(System.currentTimeMillis()));
于 2015-10-15T14:48:22.070 に答える
0

現在、Twitter のタイム レスポンスは次のようになっています: Thu Nov 05 03:13:48 +0000 2015

私はそれらを5 秒前/5 分前/5 時間前/5 日前に変換して、コスチューム関数を呼び出しています。

public void TwitterTimeDifferentitaion(String responseTime) {

SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
                    ParsePosition pos = new ParsePosition(0);
                    long then = formatter.parse(responseTime, pos).getTime();
                    long now = new Date().getTime();

                    long seconds = (now - then) / 1000;
                    long minutes = seconds / 60;
                    long hours = minutes / 60;
                    long days = hours / 24;

                    String friendly = null;
                    long num = 0;
                    if (days > 0) {
                        num = days;
                        friendly = days + " day";
                    }
                    else if (hours > 0) {
                        num = hours;
                        friendly = hours + " hour";
                    }
                    else if (minutes > 0) {
                        num = minutes;
                        friendly = minutes + " minute";
                    }
                    else {
                        num = seconds;
                        friendly = seconds + " second";
                    }
                    if (num > 1) {
                        friendly += "s";
                    }
                    createdAt = friendly + " ago";
                    System.out.println("TotalTime>>" + createdAt);

}  

SimpleDateFormat() よりも応答フォーマットが変更されるたびに、変更も完璧に機能します..!!!

于 2015-11-06T05:16:41.887 に答える