web-dev-qa-db-ja.com

2つの日付間の差(分単位)

2つの日付間の分数を取得する必要があります。私はJodaが最も適していることを知っていますが、これはAndroidプロジェクトのためのものです。そのため、できるだけ小さな外部ライブラリを使用することを好みます。そして、私が構築しているアプリは、外科的に正確な計算。

しかし、私が使用しているコードは機能していないようです。 「11/21/2011 7:00:00 AM」と「11/21/2011 1:00:00 PM」の間の分数(360分)を取得しようとしていますが、コードI '0を使用して返します:

int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM"));

public static Date GetItemDate(final String date)
{
    final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
    final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a");
    format.setCalendar(cal);

    try {
        return format.parse(date);
    } catch (ParseException e) {
        return null;
    }
}

public static int minutesDiff(Date earlierDate, Date laterDate)
{
    if( earlierDate == null || laterDate == null ) return 0;

    return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
}
18
Kris B

私はあなたのコードを通してデバッグしました:GetItemDate()にはParseExceptionがあり、次のような日付文字列の両方に対応しています:

解析できない日付:2011年11月21日07:00:00 AM

問題は、AM/PM時間の解析が "hh"(スモールキャップ!)または "KK"でのみ機能することです。少なくともそれは私の電話の場合です(私たちの一部はこの問題をまったく見なかったようです)。私はそれがシングル "h"でも動作することをテストしました。

hh = 1〜12
KK = 0-11
HH = 0〜23
kk = 1〜24

SimpleDateFormat行を次のように変更します。

final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);


この投稿では、「a」とLocaleについて説明しています: AM/PMマーカーでDateTime-stringを解析できません

PS。私はフィンランド出身なので、これを機能させるには「Locale.US」の部分を使用する必要があります。米国の居住者はそれなしでコードをテストするかもしれません。

5

GetItemDateがいずれかの日付で失敗した場合、ゼロを取得します。 catchステートメントにprintlnまたはdebugを配置して問題を出力し、それが何かを教えてくれるかどうかを確認します。

また、練習として、変更します。

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));

に:

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
return (int) result;

これにより、IDEで数学の結果を表示する機会が得られます。

15
Thom