How can I calculate a time difference in Java?

Java

Java Problem Overview


I want to subtract two time periods say 16:00:00 from 19:00:00. Is there any Java function for this? The results can be in milliseconds, seconds, or minutes.

Java Solutions


Solution 1 - Java

Java 8 has a cleaner solution - Instant and Duration

Example:

import java.time.Duration;
import java.time.Instant;
...
Instant start = Instant.now();
//your code
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Time taken: "+ timeElapsed.toMillis() +" milliseconds");

Solution 2 - Java

String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime(); 

Difference is in milliseconds.

I modified sfaizs post.

Solution 3 - Java

To get pretty timing differences, then

// d1, d2 are dates
long diff = d2.getTime() - d1.getTime();

long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);

System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");

Solution 4 - Java

Java 8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime dateTime1= LocalDateTime.parse("2014-11-25 19:00:00", formatter);
LocalDateTime dateTime2= LocalDateTime.parse("2014-11-25 16:00:00", formatter);

long diffInMilli = java.time.Duration.between(dateTime1, dateTime2).toMillis();
long diffInSeconds = java.time.Duration.between(dateTime1, dateTime2).getSeconds();
long diffInMinutes = java.time.Duration.between(dateTime1, dateTime2).toMinutes();

Solution 5 - Java

Just like any other language; convert your time periods to a unix timestamp (ie, seconds since the Unix epoch) and then simply subtract. Then, the resulting seconds should be used as a new unix timestamp and read formatted in whatever format you want.

Ah, give the above poster (genesiss) his due credit, code's always handy ;) Though, you now have an explanation as well :)

Solution 6 - Java

import java.util.Date;
...
Date d1 = new Date();
...
...
Date d2 = new Date();
System.out.println(d2.getTime()-d1.getTime()); //gives the time difference in milliseconds.	
System.out.println((d2.getTime()-d1.getTime())/1000); //gives the time difference in seconds.

and, to show in a nicer format, you can use:

    DecimalFormat myDecimalFormatter = new DecimalFormat("###,###.###");
    System.out.println(myDecimalFormatter.format(((double)d2.getTime()-d1.getTime())/1000));

Solution 7 - Java

Besides the most common approach with Period and Duration objects you can widen your knowledge with another way for dealing with time in Java.

Advanced Java 8 libraries. ChronoUnit for Differences.

ChronoUnit is a great way to determine how far apart two Temporal values are. Temporal includes LocalDate, LocalTime and so on.

LocalTime one = LocalTime.of(5,15);
LocalTime two = LocalTime.of(6,30);
LocalDate date = LocalDate.of(2019, 1, 29);

System.out.println(ChronoUnit.HOURS.between(one, two)); //1
System.out.println(ChronoUnit.MINUTES.between(one, two)); //75
System.out.println(ChronoUnit.MINUTES.between(one, date)); //DateTimeException

First example shows that between truncates rather than rounds.

The second shows how easy it is to count different units.

And the last example reminds us that we should not mess up with dates and times in Java :)

Solution 8 - Java

public class timeDifference {

    public static void main(String[] args) {

        try {
            Date startTime = Calendar.getInstance().getTime();
            Thread.sleep(10000);
            Date endTime = Calendar.getInstance().getTime();

            long difference = endTime.getTime() - startTime.getTime();

            long differenceSeconds = difference / 1000 % 60;
            long differenceMinutes = difference / (60 * 1000) % 60;
            long differenceHours = difference / (60 * 60 * 1000) % 24;
            long differenceDays = difference / (24 * 60 * 60 * 1000);

            System.out.println(differenceDays + " days, ");
            System.out.println(differenceHours + " hours, ");
            System.out.println(differenceMinutes + " minutes, ");
            System.out.println(differenceSeconds + " seconds.");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Solution 9 - Java

I found this cleaner.

Date start = new Date();

//Waiting for 10 seconds
Thread.sleep(10000);

Date end = new Date();
long diff = end.getTime() - start.getTime();
String TimeTaken = String.format("[%s] hours : [%s] mins : [%s] secs",
                                 Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),
                                 TimeUnit.MILLISECONDS.toMinutes(diff),
                                 TimeUnit.MILLISECONDS.toSeconds(diff));
System.out.println(String.format("Time taken %s", TimeTaken));
Output
Time taken [0] hours : [0] mins : [10] secs

Solution 10 - Java

The painful way is to convert to millis and do the subtraction and then back to whatever seconds or so you want. The better way is to use JodaTime.

Solution 11 - Java

String start = "12:00:00";
String end = "02:05:00";

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

Date date1 = format.parse(start);

Date date2 = format.parse(end);

long difference = date2.getTime() - date1.getTime(); 

int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);

if(minutes<0)minutes += 1440; 

Now minutes will be the correct duration between two time (in minute).

Solution 12 - Java

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws Exception {
        String time1 = "12:00:00";
        String time2 = "12:01:00";
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
        Date date1 = format.parse(time1);
        Date date2 = format.parse(time2);
        long difference = date2.getTime() - date1.getTime();
        System.out.println(difference/1000);
    }
}

It throws exception handles parsing exceptions.

Solution 13 - Java

Аlternative option if time from different days is taken, for example: 22:00 and 01:55.

public static long getDiffTime(Date date1, Date date2){
        if (date2.getTime() - date1.getTime() < 0) {// if for example date1 = 22:00, date2 = 01:55.
            Calendar c = Calendar.getInstance();
            c.setTime(date2);
            c.add(Calendar.DATE, 1);
            date2 = c.getTime();
        } //else for example date1 = 01:55, date2 = 03:55.
        long ms = date2.getTime() - date1.getTime();

        //235 minutes ~ 4 hours for (22:00 -- 01:55).
        //120 minutes ~ 2 hours for (01:55 -- 03:55).
        return TimeUnit.MINUTES.convert(ms, TimeUnit.MILLISECONDS);
    }

Solution 14 - Java

Try this:

public String timeDifference8(String startTime, String endTime) {
    LocalTime initialTime = LocalTime.parse(startTime);
    LocalTime finalTime =LocalTime.parse(endTime);
    StringJoiner joiner = new StringJoiner(":");
    long hours = initialTime.until( finalTime, ChronoUnit.HOURS);
    initialTime = initialTime.plusHours( hours );
    long minutes = initialTime.until(finalTime, ChronoUnit.MINUTES);
    initialTime = initialTime.plusMinutes( minutes );
    long seconds = initialTime.until( finalTime, ChronoUnit.SECONDS);
    joiner.add(String.valueOf(hours));
    joiner.add(String.valueOf(minutes));
    joiner.add(String.valueOf(seconds));
    return joiner.toString();
}

Solution 15 - Java

import java.sql.*;

class Time3 {

	public static void main(String args[]){ 
		String time1 = "01:03:23";
		String time2 = "02:32:00";
		long difference ;
		Time t1 = Time.valueOf(time1);
		Time t2 = Time.valueOf(time2);
		if(t2.getTime() >= t1.getTime()){
			difference = t2.getTime() - t1.getTime() -19800000;
		}
		else{
			difference = t1.getTime() - t2.getTime() -19800000;
		}
		
		java.sql.Time time = new java.sql.Time(difference); 
		System.out.println(time);
	} 
	
} 

Solution 16 - Java

This can be easily done using Java 8 LocalTime;

String time1 = "16:00:00";
String time2 = "19:00:00";

long seconds = Duration.between(LocalTime.parse(time1), LocalTime.parse(time2)).getSeconds()

Duration also supports toMillis(), toMinutes() which can be used in place of getSeconds() to get milliseconds or minutes

Solution 17 - Java

	/*
 * Total time calculation.
 */
private void getTotalHours() {
	try {
		// TODO Auto-generated method stub
		if (tfTimeIn.getValue() != null && tfTimeOut.getValue() != null) {
			Long min1 = tfTimeOut.getMinutesValue();
			Long min2 = tfTimeIn.getMinutesValue();
			Long hr1 = tfTimeOut.getHoursValue();
			Long hr2 = tfTimeIn.getHoursValue();
			Long hrsTotal = new Long("0");
			Long minTotal = new Long("0");
			if ((hr2 - hr1) == 1) {
				hrsTotal = (long) 1;
				if (min1 != 0 && min2 == 0) {
					minTotal = (long) 60 - min1;
				} else if (min1 == 0 && min2 != 0) {
					minTotal = min2;
				} else if (min1 != 0 && min2 != 0) {
					minTotal = min2;
					Long minOne = (long) 60 - min1;
					Long minTwo = min2;
					minTotal = minOne + minTwo;
				}
				if (minTotal >= 60) {
					hrsTotal++;
					minTotal = minTotal % 60;
				}
			} else if ((hr2 - hr1) > 0) {
				hrsTotal = (hr2 - hr1);
				if (min1 != 0 && min2 == 0) {
					minTotal = (long) 60 - min1;
				} else if (min1 == 0 && min2 != 0) {
					minTotal = min2;
				} else if (min1 != 0 && min2 != 0) {
					minTotal = min2;
					Long minOne = (long) 60 - min1;
					Long minTwo = min2;
					minTotal = minOne + minTwo;
				}
				if (minTotal >= 60) {
					minTotal = minTotal % 60;
				}
			} else if ((hr2 - hr1) == 0) {
				if (min1 != 0 || min2 != 0) {
					if (min2 > min1) {
						hrsTotal = (long) 0;
						minTotal = min2 - min1;
					} else {
						Notification.show("Enter A Valid Time");
						tfTotalTime.setValue("00.00");
					}
				}
			} else {
				Notification.show("Enter A Valid Time");
				tfTotalTime.setValue("00.00");
			}
			String hrsTotalString = hrsTotal.toString();
			String minTotalString = minTotal.toString();
			if (hrsTotalString.trim().length() == 1) {
				hrsTotalString = "0" + hrsTotalString;
			}
			if (minTotalString.trim().length() == 1) {
				minTotalString = "0" + minTotalString;
			}
			tfTotalTime.setValue(hrsTotalString + ":" + minTotalString);
		} else {
			tfTotalTime.setValue("00.00");
		}
	}
	catch (Exception e) {
		e.printStackTrace();
	}
}

Solution 18 - Java

class TimeCalculator
{
    String updateTime;

    public TimeCalculator(String time)
    {
        // Time should be in 24 hours format like 15/06/2016 17:39:20
        this.updateTime = time;
    }

    public String getTimeDifference()
    {
        String td = null;

        // Get Current Time
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        Date currentDate = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(currentDate);

        int c_year = calendar.get(Calendar.YEAR);
        int c_month = calendar.get(Calendar.MONTH) + 1;
        int c_day = calendar.get(Calendar.DAY_OF_MONTH);

        // Get Editing Time

        Date edit_date = sdf.parse(updateTime);
        Calendar edit_calendar = new GregorianCalendar();
        edit_calendar.setTime(edit_date);

        int e_year = edit_calendar.get(Calendar.YEAR);
        int e_month = edit_calendar.get(Calendar.MONTH) + 1;
        int e_day = edit_calendar.get(Calendar.DAY_OF_MONTH);

        if(e_year == c_year && e_month == c_month && e_day == c_day)
        {
            int c_hours = calendar.get(Calendar.HOUR_OF_DAY);
            int c_minutes = calendar.get(Calendar.MINUTE);
            int c_seconds = calendar.get(Calendar.SECOND);

            int e_hours = edit_calendar.get(Calendar.HOUR_OF_DAY);
            int e_minutes = edit_calendar.get(Calendar.MINUTE);
            int e_seconds = edit_calendar.get(Calendar.SECOND);

            if(c_hours == e_hours && c_minutes == e_minutes && c_seconds == e_seconds)
            {
                td = "just now";
                return td;
            }
            else if(c_hours == e_hours && c_minutes == e_minutes)
            {
                int d_seconds = c_seconds-e_seconds;
                td = String.valueOf(d_seconds);
                td = td + " seconds ago";
                return td;
            }
            else if(c_hours == e_hours && c_minutes != e_minutes)
            {
                int d_minutes = c_minutes-e_minutes;
                int d_seconds;
                if(c_seconds>e_seconds)
                {
                    d_seconds = c_seconds-e_seconds;
                }
                else
                {
                    d_seconds = e_seconds-c_seconds;
                }
                td = "00:" + String.valueOf(d_minutes) + ":" + String.valueOf(d_seconds) + " ago";
                return td;
            }
            else
            {
                int d_minutes, d_seconds, d_hours;
                d_hours = c_hours-e_hours;
                if(c_minutes>e_minutes)
                {
                    d_minutes = c_minutes - e_minutes;
                }
                else
                {
                    d_minutes = e_minutes - c_minutes;
                }
                if(c_seconds>e_seconds)
                {
                    d_seconds = c_seconds - e_seconds;
                }
                else
                {
                    d_seconds = e_seconds - c_seconds;
                }

                td = String.valueOf(d_hours) + ":" + String.valueOf(d_minutes) + ":" + String.valueOf(d_seconds) + " ago";
                return td;
            }
        }
        else if(e_year == c_year && e_month == c_month && c_day == e_day+1)
        {
            td = "yesterday";
            return td;
        }
        else
        {
            td = updateTime;
            return td;
        }
    }

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser607304View Question on Stackoverflow
Solution 1 - JavaAnila SebastianView Answer on Stackoverflow
Solution 2 - JavaUros KView Answer on Stackoverflow
Solution 3 - JavaFizer KhanView Answer on Stackoverflow
Solution 4 - JavaAlex BView Answer on Stackoverflow
Solution 5 - JavaChristianView Answer on Stackoverflow
Solution 6 - JavaAlisaView Answer on Stackoverflow
Solution 7 - JavaAlexander GolovinovView Answer on Stackoverflow
Solution 8 - JavaDineshView Answer on Stackoverflow
Solution 9 - JavaAmit ShakyaView Answer on Stackoverflow
Solution 10 - JavaManfred MoserView Answer on Stackoverflow
Solution 11 - JavaMd. Rayhanuzzaman RokyView Answer on Stackoverflow
Solution 12 - JavaSushmidha SakthiveeranView Answer on Stackoverflow
Solution 13 - Javauser3541830View Answer on Stackoverflow
Solution 14 - JavaBhavish SalianView Answer on Stackoverflow
Solution 15 - JavatharsikanView Answer on Stackoverflow
Solution 16 - JavaArunView Answer on Stackoverflow
Solution 17 - Javauser5519797View Answer on Stackoverflow
Solution 18 - JavaPrashant KumarView Answer on Stackoverflow