1

したがって、私のメソッドは 24 時間形式 ("HH:MM:SS") で時刻を受け取り、時差の文字列を返します。現地時間の午後 2:00 の場合、「16:30:00」(午後 4:30) を送信して、「2 時間 30 分」という出力を取得できるはずです。しかし、コードにはいくつかの問題があり、私は初心者であり、修正するために助けが必要です.

問題は、時刻が午後 4 時 40 分で、「17:00:00」(午後 5 時) を送信した場合、0 時間 20 分ではなく 12 時間 20 分というメッセージが返されることです。もう1つの問題は、現在の時刻を送信した場合、本来の24時間ではなく、「12時間」離れて返されることです。

私はJavaの初心者であり、数学は本当に私のものではないことに注意してください。そのため、どんな助けも大歓迎です。ありがとう。

private static String timeUntil(String distanceTime) {
String returnMsg = null;
try {
    SimpleDateFormat sdfDate = new SimpleDateFormat("hh:mm:ss");
    Date now = new Date();
    java.text.DateFormat df = new java.text.SimpleDateFormat("hh:mm:ss");
    Date date1 = df.parse(sdfDate.format(now));
    Date date2 = df.parse(distanceTime);
    long diff = date2.getTime() - date1.getTime();
    int timeInSeconds = (int) (diff / 1000);
    int hours, minutes;

    hours = timeInSeconds / 3600;
    timeInSeconds = timeInSeconds - (hours * 3600);
    minutes = timeInSeconds / 60;

    if (hours >= 0) {
    returnMsg = hours + " hours" +
            "\n" + minutes + " mins";
    } else {
    returnMsg = minutes + " mins";
    }
} catch (Exception e) {
    e.printStackTrace();
}
return returnMsg;
}
4

5 に答える 5

4

日付形式では、 は12時間制hhに使用されます。24時間使用:HH

new SimpleDateFormat("HH:mm:ss");
于 2013-02-14T21:58:48.597 に答える
0

これは固定コードです。日付形式を HH:mm:ss に変更し、計算ロジックも変更しました。試してみて、私たちに知らせてください

private static String timeUntil(String distanceTime) {
    String returnMsg = null;
    try {
        SimpleDateFormat sdfDate = new SimpleDateFormat("HH:mm:ss");
        Date now = new Date();
        java.text.DateFormat df = new java.text.SimpleDateFormat("HH:mm:ss");
        Date date1 = df.parse(sdfDate.format(now));
        Date date2 = df.parse(distanceTime);
        long diff = date2.getTime() - date1.getTime();
        int timeInSeconds = (int) (diff / 1000);
        int hours, minutes;

        hours = timeInSeconds / 3600;
        timeInSeconds = timeInSeconds - (hours * 3600);
        minutes = timeInSeconds / 60;

        if (hours != 0) {
        returnMsg = hours + " hours" +
                "\n" + minutes + " mins";
        } else {
        returnMsg = minutes + " mins";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return returnMsg;
    }
于 2013-02-14T22:41:31.930 に答える
0

コードレビューのコメント...

  1. Date クラスのメソッドのほとんどは非推奨です。Date の代わりに Calendar (GregorianCalendar) を使用することを検討してください。

  2. 多くの場合、変数名には意味がありません。変数の意味を知るには、変数の目的を知る必要があります。より適切な変数名を使用すると、コードの保守性が向上します。df の名前は「format」または「dateFormat」に変更できます。

  3. Date オブジェクトを「今」作成し、それを df DateFormat インスタンスに渡し、さらに sdfDate インスタンスに渡し、Date に変換します。これは不要です。これを に置き換えてDate date1 = new Date();削除しDate now = new Date();ます。同様に、単位を変換するときにエラーを診断するのが非常に難しいのを見てきましdiffdiff_ms。また、名前の一貫性を保つ必要があります。「異なる」( diff) から「timeInSeconds」に変更します。どちらも「timeInXxx」または「diff_xx」である必要があります。distanceTimeパラメータの名前を次のように変更する必要がありますfutureTime

  4. 2 つの時間の差を判断するために一連の計算を行いますが、これを行うライブラリがあります。「2 つの日付の Java 差」を Google で検索すると、多くの回答が見つかります。

  5. あなたのコードは、「今」の後に 2 回目が発生することを常に想定しています。これは、メソッドの上部にあるコメントに含める必要があります。

  6. date1 と date2 をインスタンス化すると、おそらく両方とも同じ日になります。オブジェクトが作成された直後にデバッグするか、少なくともオブジェクトを標準出力に出力して、これが当てはまるかどうかを確認してください。これはあなたが本当に欲しいものですか?

  7. あなたのコードはうるう年を処理しません。

  8. すべての時間変換を自分で処理する代わりに、それを行うライブラリを探してみませんか?

于 2013-02-14T22:23:11.987 に答える
0

これは、より堅牢で、Java の最新の日付関数を使用する例です。あなたの例でもっとうまくできたかもしれないすべてのことをポイントごとに説明することができますが、良い例を示して、他の人のコードから良いスタイルまで収集できるようにする方が簡単な場合があります.

import java.util.Calendar;

public class testSpace {
     public static void main (String ... args){
            System.out.println(timeUntil("00:12:12"));      
    }

    private static String timeUntil(String distanceTime){

        String[] times = distanceTime.split(":");

        Calendar now = Calendar.getInstance();

        Calendar then = Calendar.getInstance();
        then.set(Calendar.SECOND, Integer.parseInt(times[2]));
        then.set(Calendar.MINUTE, Integer.parseInt(times[1]));
        then.set(Calendar.HOUR, Integer.parseInt(times[0]) % 12);
        then.set(Calendar.AM_PM,  (Integer.parseInt(times[0]) >= 12 ) ? Calendar.PM : Calendar.AM);

        boolean isFuture = (then.getTimeInMillis() > now.getTimeInMillis());

        long interval = (isFuture)
            ? then.getTimeInMillis() - now.getTimeInMillis()
            : now.getTimeInMillis() - then.getTimeInMillis();

        return ((isFuture) ? "" : "-") + millToTime(interval);
    }

    public static long MILLISECOND_PER_HOUR = 1000*60*60;
    public static long MILLISECOND_PER_MIN = 1000*60;
    public static long MILLISECOND_PER_SECOND = 1000;

    public static String millToTime(long mill){
        long hours  = mill / MILLISECOND_PER_HOUR;
        long mins   = (mill % MILLISECOND_PER_HOUR) / MILLISECOND_PER_MIN;
        long sec    = ((mill % MILLISECOND_PER_HOUR) % MILLISECOND_PER_MIN) / MILLISECOND_PER_SECOND;
        return String.format("%d:%d:%d", hours, mins, sec);
    }
}
于 2013-02-14T23:16:55.523 に答える