-5

次の関数を使用して時差を計算しています。適切な出力が表示されていません。1か月の時差の後、2分の差を示しています。

プログラムの何が問題になっていますか?

public String TimestampDiff(Timestamp t) {
    long t1 = t.getTime();
    String st = null;
    long diff;
    java.util.Date date = new java.util.Date();
    long currT = date.getTime();
    System.out.println();
    System.out.println(" current timesstamp is  " + currT);

    diff = (currT - t1) / 60;
    int years = (int) Math.floor(diff / (1000 * 60 * 60 * 24 * 365));
    double remainder = Math.floor(diff % (1000 * 60 * 60 * 24 * 365));
    int days = (int) Math.floor(remainder / (1000 * 60 * 60 * 24));
    remainder = Math.floor(remainder % (1000 * 60 * 60 * 24));
    int hours = (int) Math.floor(remainder / (1000 * 60 * 60));
    remainder = Math.floor(remainder % (1000 * 60 * 60));
    int minutes = (int) Math.floor(remainder / (1000 * 60));
    remainder = Math.floor(remainder % (1000 * 60));
    int seconds = (int) Math.floor(remainder / (1000));
    System.out.println("\nyr:Ds:hh:mm:ss " + years + ":" + days + ":"
            + hours + ":" + minutes + ":" + seconds);

    if (years == 0 && days == 0 && hours == 0 && minutes == 0) {
        st = "few seconds ago";
    } else if (years == 0 && days == 0 && hours == 0) {
        st = minutes + " minuts ago";
    } else if (years == 0 && days == 0) {
        st = hours + " hours ago";
    } else if (years == 0 && days == 1) {
        st = new SimpleDateFormat("'yesterday at' hh:mm a").format(t1);

    } else if (years == 0 && days > 1) {
        st = new SimpleDateFormat(" MMM d 'at' hh:mm a").format(t1);

    } else if (years > 0) {
        st = new SimpleDateFormat("MMM d ''yy 'at' hh:mm a").format(t1);

    }
    st = st.replace("AM", "am").replace("PM", "pm");
    return st;
}
4

3 に答える 3

9

Joda Timeをご覧になることをお勧めします。

Joda-Time は、Java SE 8 より前の Java の事実上の標準の日付と時刻のライブラリです。現在、ユーザーは java.time (JSR-310) に移行するよう求められています。

インストール

  • Debian ベースのシステムの場合: libjoda-time-java. 瓶は次のようになり/usr/share/javaますjoda-time.jar
  • その他の場合:最新の jar をダウンロードします。たとえば、joda-time-2.2.jar を含む joda-time-2.2-dist.zip です。

Eclipse を使用する場合は、それを Java ビルド パスに追加します ([プロジェクト] > [プロパティ] > [Java ビルド パス] > [外部 Jar を追加])。

関連する JavaDoc

サンプルコード

import java.sql.Timestamp;
import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public class MinimalWorkingExample {
    static Date date = new Date(1990, 4, 28, 12, 59);

    public static String getTimestampDiff(Timestamp t) {
        final DateTime start = new DateTime(date.getTime());
        final DateTime end = new DateTime(t);
        Period p = new Period(start, end);
        PeriodFormatter formatter = new PeriodFormatterBuilder()
                .printZeroAlways().minimumPrintedDigits(2).appendYears()
                .appendSuffix(" year", " years").appendSeparator(", ")
                .appendMonths().appendSuffix(" month", " months")
                .appendSeparator(", ").appendDays()
                .appendSuffix(" day", " days").appendSeparator(" and ")
                .appendHours().appendLiteral(":").appendMinutes()
                .appendLiteral(":").appendSeconds().toFormatter();
        return p.toString(formatter);
    }

    public static void main(String[] args) {
        String diff = getTimestampDiff(new Timestamp(2013, 3, 20, 7, 51, 0, 0));
        System.out.println(diff);
    }
}

出力:

22 years, 10 months, 01 day and 18:52:00

新しいソリューションをお勧めする理由

  • 短いです(1665文字/ 41行と比較して726文字/ 14行)
  • 理解しやすい
  • 調整しやすくなりました
  • コードとプレゼンテーションの分離がより明確に
  • コードを修正したくない
于 2013-03-21T07:02:00.400 に答える
-1

longにキャストしないでくださいint。精度が失われます。すべてintlongに変更して、違いを確認してください。

この助けを願っています

于 2013-03-21T06:30:36.467 に答える