How to find the duration of the difference between two dates in java?

I have two DateTime objects that should find the duration of their difference ,

I have the following code, but not sure how to continue it, to get the expected results as follows:

Example

11/03/14 09:30:58 11/03/14 09:33:43 elapsed time is 02 minutes and 45 seconds ----------------------------------------------------- 11/03/14 09:30:58 11/03/15 09:30:58 elapsed time is a day ----------------------------------------------------- 11/03/14 09:30:58 11/03/16 09:30:58 elapsed time is two days ----------------------------------------------------- 11/03/14 09:30:58 11/03/16 09:35:58 elapsed time is two days and 05 mintues 

The code

  String dateStart = "11/03/14 09:29:58"; String dateStop = "11/03/14 09:33:43"; Custom date format SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss"); Date d1 = null; Date d2 = null; try { d1 = format.parse(dateStart); d2 = format.parse(dateStop); } catch (ParseException e) { e.printStackTrace(); } // Get msec from each, and subtract. long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); System.out.println("Time in seconds: " + diffSeconds + " seconds."); System.out.println("Time in minutes: " + diffMinutes + " minutes."); System.out.println("Time in hours: " + diffHours + " hours."); 
+88
java date-arithmetic
Jul 30 '13 at 6:55
source share
14 answers

try the following

 { Date dt2 = new DateAndTime().getCurrentDateTime(); long diff = dt2.getTime() - dt1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24)); if (diffInDays > 1) { System.err.println("Difference in number of days (2) : " + diffInDays); return false; } else if (diffHours > 24) { System.err.println(">24"); return false; } else if ((diffHours == 24) && (diffMinutes >= 1)) { System.err.println("minutes"); return false; } return true; } 
+61
Nov 10 '13 at 6:58
source share

Date difference conversion can be handled better using the built-in Java class TimeUnit . It provides utility methods for this:

 Date startDate = // Set start date Date endDate = // Set end date long duration = endDate.getTime() - startDate.getTime(); long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration); long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration); long diffInHours = TimeUnit.MILLISECONDS.toHours(duration); long diffInDays = TimeUnit.MILLISECONDS.toDays(duration); 
+155
Jul 30 '13 at 7:19
source share

Use the Joda-Time Library

 DateTime startTime, endTime; Period p = new Period(startTime, endTime); long hours = p.getHours(); long minutes = p.getMinutes(); 

Joda Time has the concept of a time interval:

 Interval interval = new Interval(oldTime, new Instant()); 

Another Example Date Difference

Another Link

or with Java-8 (which integrated Joda-Time concepts)

 Instant start, end;// Duration dur = Duration.between(start, stop); long hours = dur.toHours(); long minutes = dur.toMinutes(); 
+42
Jul 30 '13 at 6:58
source share

This is how the problem can be solved in Java 8 in the same way as shamimz answer.

Source: http://docs.oracle.com/javase/tutorial/datetime/iso/period.html

 LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1); Period p = Period.between(birthday, today); long p2 = ChronoUnit.DAYS.between(birthday, today); System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)"); 

The code produces output similar to the following:

 You are 53 years, 4 months, and 29 days old. (19508 days total) 

We must use LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html to get hour, minute, second differences.

+12
Jun 04 '14 at 22:19
source share
 Date d2 = new Date(); Date d1 = new Date(1384831803875l); long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); int diffInDays = (int) diff / (1000 * 60 * 60 * 24); System.out.println(diffInDays+" days"); System.out.println(diffHours+" Hour"); System.out.println(diffMinutes+" min"); System.out.println(diffSeconds+" sec"); 
+6
Nov 19 '13 at 3:40
source share

You can create a method like

 public long getDaysBetweenDates(Date d1, Date d2){ return TimeUnit.MILLISECONDS.toDays(d1.getTime() - d2.getTime()); } 

This method will return the number of days between two days.

+6
Oct 27 '15 at 12:26
source share

As Michael Borgwardt writes in his answer here :

 int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) / (1000 * 60 * 60 * 24) ) 

Note that this works with UTC dates, so the difference may be in the afternoon if you look at local dates. And getting it to work correctly with local dates requires a completely different approach due to daylight saving time.

+5
Jul 30 '13 at 6:58
source share

In Java 8, you can do DateTimeFormatter , Duration and LocalDateTime . Here is an example:

 final String dateStart = "11/03/14 09:29:58"; final String dateStop = "11/03/14 09:33:43"; final DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendValue(ChronoField.MONTH_OF_YEAR, 2) .appendLiteral('/') .appendValue(ChronoField.DAY_OF_MONTH, 2) .appendLiteral('/') .appendValueReduced(ChronoField.YEAR, 2, 2, 2000) .appendLiteral(' ') .appendValue(ChronoField.HOUR_OF_DAY, 2) .appendLiteral(':') .appendValue(ChronoField.MINUTE_OF_HOUR, 2) .appendLiteral(':') .appendValue(ChronoField.SECOND_OF_MINUTE, 2) .toFormatter(); final LocalDateTime start = LocalDateTime.parse(dateStart, formatter); final LocalDateTime stop = LocalDateTime.parse(dateStop, formatter); final Duration between = Duration.between(start, stop); System.out.println(start); System.out.println(stop); System.out.println(formatter.format(start)); System.out.println(formatter.format(stop)); System.out.println(between); System.out.println(between.get(ChronoUnit.SECONDS)); 
+3
Nov 17 '15 at 20:30
source share

This is the code:

  String date1 = "07/15/2013"; String time1 = "11:00:01"; String date2 = "07/16/2013"; String time2 = "22:15:10"; String format = "MM/dd/yyyy HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(format); Date fromDate = sdf.parse(date1 + " " + time1); Date toDate = sdf.parse(date2 + " " + time2); long diff = toDate.getTime() - fromDate.getTime(); String dateFormat="duration: "; int diffDays = (int) (diff / (24 * 60 * 60 * 1000)); if(diffDays>0){ dateFormat+=diffDays+" day "; } diff -= diffDays * (24 * 60 * 60 * 1000); int diffhours = (int) (diff / (60 * 60 * 1000)); if(diffhours>0){ dateFormat+=diffhours+" hour "; } diff -= diffhours * (60 * 60 * 1000); int diffmin = (int) (diff / (60 * 1000)); if(diffmin>0){ dateFormat+=diffmin+" min "; } diff -= diffmin * (60 * 1000); int diffsec = (int) (diff / (1000)); if(diffsec>0){ dateFormat+=diffsec+" sec"; } System.out.println(dateFormat); 

and output:

 duration: 1 day 11 hour 15 min 9 sec 
+1
Nov 19 '15 at 11:53 on
source share

This is a program I wrote that gets the number of days between two dates (no time here).

 import java.util.Scanner; public class HelloWorld { public static void main(String args[]) { Scanner s = new Scanner(System.in); System.out.print("Enter starting date separated by dots: "); String inp1 = s.nextLine(); System.out.print("Enter ending date separated by dots: "); String inp2 = s.nextLine(); int[] nodim = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; String[] inpArr1 = split(inp1); String[] inpArr2 = split(inp2); int d1 = Integer.parseInt(inpArr1[0]); int m1 = Integer.parseInt(inpArr1[1]); int y1 = Integer.parseInt(inpArr1[2]); int d2 = Integer.parseInt(inpArr2[0]); int m2 = Integer.parseInt(inpArr2[1]); int y2 = Integer.parseInt(inpArr2[2]); if (y1 % 4 == 0) nodim[2] = 29; int diff = m1 == m2 && y1 == y2 ? d2 - (d1 - 1) : (nodim[m1] - (d1 - 1)); int mm1 = m1 + 1, mm2 = m2 - 1, yy1 = y1, yy2 = y2; for (; yy1 <= yy2; yy1++, mm1 = 1) { mm2 = yy1 == yy2 ? (m2 - 1) : 12; if (yy1 % 4 == 0) nodim[2] = 29; else nodim[2] = 28; if (mm2 == 0) { mm2 = 12; yy2 = yy2 - 1; } for (; mm1 <= mm2 && yy1 <= yy2; mm1++) diff = diff + nodim[mm1]; } System.out.print("No. of days from " + inp1 + " to " + inp2 + " is " + diff); } public static String[] split(String s) { String[] retval = { "", "", "" }; s = s + "."; s = s + " "; for (int i = 0; i <= 2; i++) { retval[i] = s.substring(0, s.indexOf(".")); s = s.substring((s.indexOf(".") + 1), s.length()); } return retval; } } 

http://pastebin.com/HRsjTtUf

0
Aug 11 '16 at 17:15
source share

I have solved a similar problem using a simple method recently.

 public static void main(String[] args) throws IOException, ParseException { TimeZone utc = TimeZone.getTimeZone("UTC"); Calendar calendar = Calendar.getInstance(utc); Date until = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, -7); Date since = calendar.getTime(); long durationInSeconds = TimeUnit.MILLISECONDS.toSeconds(until.getTime() - since.getTime()); long SECONDS_IN_A_MINUTE = 60; long MINUTES_IN_AN_HOUR = 60; long HOURS_IN_A_DAY = 24; long DAYS_IN_A_MONTH = 30; long MONTHS_IN_A_YEAR = 12; long sec = (durationInSeconds >= SECONDS_IN_A_MINUTE) ? durationInSeconds % SECONDS_IN_A_MINUTE : durationInSeconds; long min = (durationInSeconds /= SECONDS_IN_A_MINUTE) >= MINUTES_IN_AN_HOUR ? durationInSeconds%MINUTES_IN_AN_HOUR : durationInSeconds; long hrs = (durationInSeconds /= MINUTES_IN_AN_HOUR) >= HOURS_IN_A_DAY ? durationInSeconds % HOURS_IN_A_DAY : durationInSeconds; long days = (durationInSeconds /= HOURS_IN_A_DAY) >= DAYS_IN_A_MONTH ? durationInSeconds % DAYS_IN_A_MONTH : durationInSeconds; long months = (durationInSeconds /=DAYS_IN_A_MONTH) >= MONTHS_IN_A_YEAR ? durationInSeconds % MONTHS_IN_A_YEAR : durationInSeconds; long years = (durationInSeconds /= MONTHS_IN_A_YEAR); String duration = getDuration(sec,min,hrs,days,months,years); System.out.println(duration); } private static String getDuration(long secs, long mins, long hrs, long days, long months, long years) { StringBuffer sb = new StringBuffer(); String EMPTY_STRING = ""; sb.append(years > 0 ? years + (years > 1 ? " years " : " year "): EMPTY_STRING); sb.append(months > 0 ? months + (months > 1 ? " months " : " month "): EMPTY_STRING); sb.append(days > 0 ? days + (days > 1 ? " days " : " day "): EMPTY_STRING); sb.append(hrs > 0 ? hrs + (hrs > 1 ? " hours " : " hour "): EMPTY_STRING); sb.append(mins > 0 ? mins + (mins > 1 ? " mins " : " min "): EMPTY_STRING); sb.append(secs > 0 ? secs + (secs > 1 ? " secs " : " secs "): EMPTY_STRING); sb.append("ago"); return sb.toString(); } 

And as expected, it prints: 7 days ago .

0
Feb 25 '17 at 7:43
source share

In relation to updating the shamim response, here is a method that performs the task without using a third-party library. Just copy the method and use

 public static String getDurationTimeStamp(String date) { String timeDifference = ""; //date formatter as per the coder need SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //parse the string date-ti // me to Date object Date startDate = null; try { startDate = sdf.parse(date); } catch (ParseException e) { e.printStackTrace(); } //end date will be the current system time to calculate the lapse time difference //if needed, coder can add end date to whatever date Date endDate = new Date(); System.out.println(startDate); System.out.println(endDate); //get the time difference in milliseconds long duration = endDate.getTime() - startDate.getTime(); //now we calculate the differences in different time units //this long value will be the total time difference in each unit //ie; total difference in seconds, total difference in minutes etc... long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration); long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration); long diffInHours = TimeUnit.MILLISECONDS.toHours(duration); long diffInDays = TimeUnit.MILLISECONDS.toDays(duration); //now we create the time stamps depending on the value of each unit that we get //as we do not have the unit in years, //we will see if the days difference is more that 365 days, as 365 days = 1 year if (diffInDays > 365) { //we get the year in integer not in float //ex- 791/365 = 2.167 in float but it will be 2 years in int int year = (int) (diffInDays / 365); timeDifference = year + " years ago"; System.out.println(year + " years ago"); } //if days are not enough to create year then get the days else if (diffInDays > 1) { timeDifference = diffInDays + " days ago"; System.out.println(diffInDays + " days ago"); } //if days value<1 then get the hours else if (diffInHours > 1) { timeDifference = diffInHours + " hours ago"; System.out.println(diffInHours + " hours ago"); } //if hours value<1 then get the minutes else if (diffInMinutes > 1) { timeDifference = diffInMinutes + " minutes ago"; System.out.println(diffInMinutes + " minutes ago"); } //if minutes value<1 then get the seconds else if (diffInSeconds > 1) { timeDifference = diffInSeconds + " seconds ago"; System.out.println(diffInSeconds + " seconds ago"); } return timeDifference; // that all. Happy Coding :) } 
0
Jan 09 '19 at 12:22
source share

It worked for me, you can try with it, I hope it will be useful. Let me know if something bothers.

 Date startDate = java.util.Calendar.getInstance().getTime(); //set your start time Date endDate = java.util.Calendar.getInstance().getTime(); // set your end time long duration = endDate.getTime() - startDate.getTime(); long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration); long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration); long diffInHours = TimeUnit.MILLISECONDS.toHours(duration); long diffInDays = TimeUnit.MILLISECONDS.toDays(duration); Toast.makeText(MainActivity.this, "Diff" + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds, Toast.LENGTH_SHORT).show(); **// Toast message for android .** System.out.println("Diff" + duration + diffInDays + diffInHours + diffInMinutes + diffInSeconds); **// Print console message for Java .** 
0
04 Feb '19 at 7:49
source share
  // calculating the difference b/w startDate and endDate String startDate = "01-01-2016"; String endDate = simpleDateFormat.format(currentDate); date1 = simpleDateFormat.parse(startDate); date2 = simpleDateFormat.parse(endDate); long getDiff = date2.getTime() - date1.getTime(); // using TimeUnit class from java.util.concurrent package long getDaysDiff = TimeUnit.MILLISECONDS.toDays(getDiff); 

How to calculate the difference between two dates in Java

-one
Jan 19 '17 at 2:44 on
source share



All Articles