3

日付間の時差を計算しようとしています:

public static void main(String args[])
{
    String start = "2013-03-10 10:28:47.000000";
    String end = "2013-04-07 09:54:08.054577";

    CalculateDuration calc = new CalculateDuration();
    calc.calculateDiffrenceInMinutes(start,end);
}
public int calculateDiffrenceInMinutes(String start_time, String end_time)
{

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(start_time);
        d2 = format.parse(end_time);
    } catch (ParseException e) {
        e.printStackTrace();
    }    

    // Get msec from each, and subtract.
    int diff = (int) d2.getTime() - (int)d1.getTime();
    int diffSeconds = (int) (diff / 1000);         
    int diffMinutes = (int) (diff / (60 * 1000));         
    int diffHours = (int) (diff / (60 * 60 * 1000));                      

    return diffMinutes;
}

何らかの理由で、終了日が開始日よりも後であっても、負の出力を示す例を理解できません。

何か案は?

4

3 に答える 3

8

変更してみる

int diff = (int) d2.getTime() - (int)d1.getTime();

long diff = d2.getTime() - d1.getTime();

longfrom からto への明示的な型キャストはint精度の低下を引き起こし、減算で負の値になる場合があります。

long a = 90000000000000L;
long b = 10000001000000L;

a>b
(int)a-(int)b => negative value
于 2013-09-02T14:02:15.267 に答える
4

他の人が精度の低下について指摘したように、ここで詳細を読むことができます。

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;  
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours   = diff / (60 * 60 * 1000) % 60;

Java の日時 API には、いくつかの設計上の問題があります。Calendar はスレッドセーフではありません。Joda-Timeを見たいと思うかもしれません。これにより、次のように簡単になります-

Seconds.between(startDate, endDate);
于 2013-09-02T14:27:30.193 に答える
2

Date#getTime()は a を返しますがlong、それには理由があります。1970 年 1 月 1 日 00:00:00 GMTからかなりのミリ秒が経過したためです。Anintはその巨大な数を保持できません (そしてオーバーフロー。(2 つの日付に応じて) 負の数が得られる理由が説明されます)。したがってlong、計算を行うために使用する必要があります。

コードを次のように変更します。

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / (          1000);         
long diffMinutes = diff / (     60 * 1000);         
long diffHours   = diff / (60 * 60 * 1000);

もちろん、calculateDiffrenceInMinutesメソッドの戻り値の型を に変更する必要もありますlong

注:あなたの例では、diffSeconds、 、diffMinutesおよびdiffHoursas のままにすることもできますint。ただし、日付が離れすぎていると失敗するソリューションになるため、お勧めしません。

于 2013-09-02T14:06:21.627 に答える