BlueCastle
BlueCastle

Reputation: 217

Time calculation with negative value results Java

I want to calculate the difference between a start time and an end time. In HH:mm format.

I receive a negative value when, for example, the start time is 22.00 and the end time is 1.00 the next day.

How do I let the program know the end time is on the next day?

My script:

public void setBeginTijd()
{
    String dateStart = "22:00";
    String dateEnd = "1:00";

    SimpleDateFormat format = new SimpleDateFormat("HH:mm");

    Date d1 = null;
    Date d2 = null;

    try
    {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateEnd);

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

        System.out.println(diffMinutes);
        System.out.println(diffHours);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Upvotes: 0

Views: 2001

Answers (5)

Vlad
Vlad

Reputation: 1763

Here is the correct math for time difference in hours & minutes. Stripping of the decimal fraction is happening automatically when you operate on int/long values.

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

Upvotes: 0

Thorben
Thorben

Reputation: 975

As already mentioned by some people, it is important to also know day, month and year of each event to calculate periods for events that are not on the same day.

I modified your method the way I think it could help you:

public void setBeginTijd()
{
        String dateStart = "22.08.2014 22:00";
        String dateEnd = "25.08.2014 01:00";

        SimpleDateFormat fullFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm");

        Date d1 = null;
        Date d2 = null;

        try
        {
            d1 = fullFormat.parse(dateStart);
            d2 = fullFormat.parse(dateEnd);

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

            System.out.println("Delta minutes: " + diffMinutes);
            System.out.println("Delta hours: " + diffHours);
            System.out.println("Delta days: " + diffDays);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
}

Upvotes: 0

Marco13
Marco13

Reputation: 54631

If you can assume that, when the time is negative, the second time must be on the next day, then you can simply say

if (diff < 0)
{
    diff = (24 * 60 * 60 * 1000) + diff;
}

EDIT to elaborate this, also in response to the comments: Of course this is a very simplistic solution. It can not handle the case where the second date is two days later. It does not handle DST switches. It does not handle the time zone change on December 31st, 1927 in Shanghai. It is no replacement for a properly modelled date with all its caveats. It is a best-effort approach to derive what can (probably) be derived from the given information.

Upvotes: 6

Tkachuk_Evgen
Tkachuk_Evgen

Reputation: 1354

Try this

    SimpleDateFormat formatNextDay = new SimpleDateFormat("dd:HH:mm");
    boolean isNextDay=false;
    try {
        if (d1.after(d2)) {
            isNextDay=true; 
            d1 = formatNextDay.parse("1:" + dateStart);
            d2 = formatNextDay.parse("2:" + dateEnd);
        }

Upvotes: 1

djm.im
djm.im

Reputation: 3323

You should include day, month and year in date.

This are dates in Java after ran program:

d1 = Thu Jan 01 22:00:00 CET 1970
d2 = Thu Jan 01 01:00:00 CET 1970

Upvotes: 0

Related Questions