75

I have two date like:

String date_1="yyyyMMddHHmmss";
String date_2="yyyyMMddHHmmss";

I want to print the difference like:

2d 3h 45m

How can I do that? Thanks!

Vini.g.fer
  • 11,639
  • 16
  • 61
  • 90
D Ferra
  • 1,223
  • 3
  • 12
  • 21

14 Answers14

209
DateTimeUtils obj = new DateTimeUtils();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/M/yyyy hh:mm:ss");

try {
    Date date1 = simpleDateFormat.parse("10/10/2013 11:30:10");
    Date date2 = simpleDateFormat.parse("13/10/2013 20:35:55");

    obj.printDifference(date1, date2);

} catch (ParseException e) {
    e.printStackTrace();
}

//1 minute = 60 seconds
//1 hour = 60 x 60 = 3600
//1 day = 3600 x 24 = 86400
public void printDifference(Date startDate, Date endDate) { 
    //milliseconds
    long different = endDate.getTime() - startDate.getTime();

    System.out.println("startDate : " + startDate);
    System.out.println("endDate : "+ endDate);
    System.out.println("different : " + different);

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;

    long elapsedDays = different / daysInMilli;
    different = different % daysInMilli;

    long elapsedHours = different / hoursInMilli;
    different = different % hoursInMilli;

    long elapsedMinutes = different / minutesInMilli;
    different = different % minutesInMilli;

    long elapsedSeconds = different / secondsInMilli;

    System.out.printf(
        "%d days, %d hours, %d minutes, %d seconds%n", 
        elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds);
}

out put is :

startDate : Thu Oct 10 11:30:10 SGT 2013
endDate : Sun Oct 13 20:35:55 SGT 2013
different : 291945000
3 days, 9 hours, 5 minutes, 45 seconds
Melquiades
  • 8,496
  • 1
  • 31
  • 46
Digvesh Patel
  • 6,503
  • 1
  • 20
  • 34
  • @DigveshPatel Any idea to calculate month and year?? – MashukKhan Mar 27 '18 at 05:16
  • 2
    what is `DateTimeUtils` ? – Ravi Vaniya Apr 25 '18 at 08:46
  • @RaviVaniya your class created in your Utils. You can name it as you please. Use its instance to call printDifference method in your class. – Red M Oct 17 '18 at 17:21
  • Before getting difference in milliseconds check if (endDate.after(startDate)) for if the enddate has been passed the start date. otherwise – Deepak Rajput Jul 07 '20 at 04:37
  • 1
    how do i show only a unit of time? for example: if only minutes for greater than 0, I show minutes, but if hours for greater than 0, I show only the hour, but if the day is greater than 0, show only the unit of day in the output – Tecnologia da Net Oct 19 '21 at 13:41
27
Date userDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob);
Date today = new Date();
long diff =  today.getTime() - userDob.getTime();
int numOfDays = (int) (diff / (1000 * 60 * 60 * 24));
int hours = (int) (diff / (1000 * 60 * 60));
int minutes = (int) (diff / (1000 * 60));
int seconds = (int) (diff / (1000));
Melquiades
  • 8,496
  • 1
  • 31
  • 46
Nilesh Savaliya
  • 666
  • 9
  • 9
23

Short & Sweet:

/**
 * Get a diff between two dates
 *
 * @param oldDate the old date
 * @param newDate the new date
 * @return the diff value, in the days
 */
public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) {
    try {
        return TimeUnit.DAYS.convert(format.parse(newDate).getTime() - format.parse(oldDate).getTime(), TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
}

Usage:

int dateDifference = (int) getDateDiff(new SimpleDateFormat("dd/MM/yyyy"), "29/05/2017", "31/05/2017");
System.out.println("dateDifference: " + dateDifference);

Output:

dateDifference: 2

Kotlin Version:

fun getDateDiff(format: SimpleDateFormat, oldDate: String, newDate: String): Long {
    return try {
        java.util.concurrent.TimeUnit.DAYS.convert(
            format.parse(newDate).time - format.parse(oldDate).time,
            java.util.concurrent.TimeUnit.MILLISECONDS
        )
    } catch (e: Exception) {
        e.printStackTrace()
        0
    }
}
Meet Vora
  • 2,783
  • 1
  • 16
  • 33
15

This works and convert to String as a Bonus ;)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    try {
        //Dates to compare
        String CurrentDate=  "09/24/2015";
        String FinalDate=  "09/26/2015";

        Date date1;
        Date date2;

        SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy");

        //Setting dates
        date1 = dates.parse(CurrentDate);
        date2 = dates.parse(FinalDate);

        //Comparing dates
        long difference = Math.abs(date1.getTime() - date2.getTime());
        long differenceDates = difference / (24 * 60 * 60 * 1000);

        //Convert long to String
        String dayDifference = Long.toString(differenceDates);

        Log.e("HERE","HERE: " + dayDifference);

    } catch (Exception exception) {
        Log.e("DIDN'T WORK", "exception " + exception);
    }
}
Melquiades
  • 8,496
  • 1
  • 31
  • 46
SoVinceble
  • 486
  • 5
  • 10
  • This answer is very much userful for getting days difference. – Stephen Jul 29 '16 at 11:38
  • @TheVince23 i am using the above code..but if the dates are in different month the result is wrong..can u please check this [link](http://stackoverflow.com/questions/39739900/difference-between-current-date-and-entered-date-in-android) – sunil y Sep 28 '16 at 07:25
5

It will give you difference in months

long milliSeconds1 = calendar1.getTimeInMillis();
long milliSeconds2 = calendar2.getTimeInMillis();
long periodSeconds = (milliSeconds2 - milliSeconds1) / 1000;
long elapsedDays = periodSeconds / 60 / 60 / 24;

System.out.println(String.format("%d months", elapsedDays/30));
Melquiades
  • 8,496
  • 1
  • 31
  • 46
Swap-IOS-Android
  • 4,363
  • 6
  • 49
  • 77
3

Here is the modern answer. It’s good for anyone who either uses Java 8 or later (which doesn’t go for most Android phones yet) or is happy with an external library.

    String date1 = "20170717141000";
    String date2 = "20170719175500";

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    Duration diff = Duration.between(LocalDateTime.parse(date1, formatter), 
                                     LocalDateTime.parse(date2, formatter));

    if (diff.isZero()) {
        System.out.println("0m");
    } else {
        long days = diff.toDays();
        if (days != 0) {
            System.out.print("" + days + "d ");
            diff = diff.minusDays(days);
        }
        long hours = diff.toHours();
        if (hours != 0) {
            System.out.print("" + hours + "h ");
            diff = diff.minusHours(hours);
        }
        long minutes = diff.toMinutes();
        if (minutes != 0) {
            System.out.print("" + minutes + "m ");
            diff = diff.minusMinutes(minutes);
        }
        long seconds = diff.getSeconds();
        if (seconds != 0) {
            System.out.print("" + seconds + "s ");
        }
        System.out.println();
    }

This prints

2d 3h 45m 

In my own opinion the advantage is not so much that it is shorter (it’s not much), but leaving the calculations to an standard library is less errorprone and gives you clearer code. These are great advantages. The reader is not burdened with recognizing constants like 24, 60 and 1000 and verifying that they are used correctly.

I am using the modern Java date & time API (described in JSR-310 and also known under this name). To use this on Android under API level 26, get the ThreeTenABP, see this question: How to use ThreeTenABP in Android Project. To use it with other Java 6 or 7, get ThreeTen Backport. With Java 8 and later it is built-in.

With Java 9 it will be still a bit easier since the Duration class is extended with methods to give you the days part, hours part, minutes part and seconds part separately so you don’t need the subtractions. See an example in my answer here.

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
  • too bad it requires API level 26 – M Shaban Ali Apr 22 '20 at 20:54
  • 1
    @MShabanAli It doesn’t really, but I wasn’t clear enough about that, sorry. I have now changed that sentence to read: *To use this on Android under API level 26, get the ThreeTenABP, see [this question: How to use ThreeTenABP in Android Project](https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project).* I did say in the start of the answer, though: *It’s good for anyone who … is happy with an external library.* – Ole V.V. Apr 23 '20 at 03:59
2

I use this: send start and end date in millisecond

public int GetDifference(long start,long end){
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(start);
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int min = cal.get(Calendar.MINUTE);
    long t=(23-hour)*3600000+(59-min)*60000;

    t=start+t;

    int diff=0;
    if(end>t){
        diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1;
    }

    return  diff;
}
ahmad dehghan
  • 37
  • 1
  • 3
2

You can calculate the difference in time in miliseconds using this method and get the outputs in seconds, minutes, hours, days, months and years.

You can download class from here: DateTimeDifference GitHub Link

  • Simple to use
long currentTime = System.currentTimeMillis();
long previousTime = (System.currentTimeMillis() - 864000000); //10 days ago

Log.d("DateTime: ", "Difference With Second: " + AppUtility.DateTimeDifference(currentTime, previousTime, AppUtility.TimeDifference.SECOND));
Log.d("DateTime: ", "Difference With Minute: " + AppUtility.DateTimeDifference(currentTime, previousTime, AppUtility.TimeDifference.MINUTE));
  • You can compare the example below
if(AppUtility.DateTimeDifference(currentTime, previousTime, AppUtility.TimeDifference.MINUTE) > 100){
    Log.d("DateTime: ", "There are more than 100 minutes difference between two dates.");
}else{
    Log.d("DateTime: ", "There are no more than 100 minutes difference between two dates.");
}
2

Try this out.

int day = 0;
        int hh = 0;
        int mm = 0;
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy 'at' hh:mm aa");
            Date oldDate = dateFormat.parse(oldTime);
            Date cDate = new Date();
            Long timeDiff = cDate.getTime() - oldDate.getTime();
            day = (int) TimeUnit.MILLISECONDS.toDays(timeDiff);
            hh = (int) (TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(day));
            mm = (int) (TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));



        } catch (ParseException e) {
            e.printStackTrace();
        }

        if (mm <= 60 && hh!= 0) {
            if (hh <= 60 && day != 0) {
                return day + " DAYS AGO";
            } else {
                return hh + " HOUR AGO";
            }
        } else {
            return mm + " MIN AGO";
        }
1
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, Locale);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, Locale);
Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

it returns how many days between given two dates, where DateTime is from joda library

subrahmanyam boyapati
  • 2,836
  • 1
  • 18
  • 28
  • Nice. I certainly agree that one should consider *not* using the long outdated `Date` and `SimpleDateFormat`, even on Android. They say that even better than Joda-Time is [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP). – Ole V.V. Jul 18 '17 at 10:15
1

I arranged a little. This works great.

@SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MM yyyy");
    Date date = new Date();
    String dateOfDay = simpleDateFormat.format(date);

    String timeofday = android.text.format.DateFormat.format("HH:mm:ss", new Date().getTime()).toString();

    @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM yyyy hh:mm:ss");
    try {
        Date date1 = dateFormat.parse(06 09 2018 + " " + 10:12:56);
        Date date2 = dateFormat.parse(dateOfDay + " " + timeofday);

        printDifference(date1, date2);

    } catch (ParseException e) {
        e.printStackTrace();
    }

@SuppressLint("SetTextI18n")
private void printDifference(Date startDate, Date endDate) {
    //milliseconds
    long different = endDate.getTime() - startDate.getTime();

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;

    long elapsedDays = different / daysInMilli;
    different = different % daysInMilli;

    long elapsedHours = different / hoursInMilli;
    different = different % hoursInMilli;

    long elapsedMinutes = different / minutesInMilli;
    different = different % minutesInMilli;

    long elapsedSeconds = different / secondsInMilli;

Toast.makeText(context, elapsedDays + " " + elapsedHours + " " + elapsedMinutes + " " + elapsedSeconds, Toast.LENGTH_SHORT).show();
}
Trk
  • 95
  • 1
  • 12
1

Here's the simple solution:

fun printDaysBetweenTwoDates(): Int {
        val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH)
        val endDateInMilliSeconds = dateFormat.parse("26-02-2022")?.time ?: 0
        val startDateInMilliSeconds = dateFormat.parse("18-02-2022")?.time ?: 0
        return getNumberOfDaysBetweenDates(startDateInMilliSeconds, endDateInMilliSeconds)
    }

 private fun getNumberOfDaysBetweenDates(
        startDateInMilliSeconds: Long,
        endDateInMilliSeconds: Long
    ): Int {
        val difference = (endDateInMilliSeconds - startDateInMilliSeconds) / (1000 * 60 * 60 * 24).toDouble()
        val noOfDays = Math.ceil(difference)
        return (noOfDays).toInt()
    }
0

You can generalize this into a function that lets you choose the output format

private String substractDates(Date date1, Date date2, SimpleDateFormat format) {
    long restDatesinMillis = date1.getTime()-date2.getTime();
    Date restdate = new Date(restDatesinMillis);

    return format.format(restdate);
}

Now is a simple function call like this, difference in hours, minutes and seconds:

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

try {
    Date date1 = formater.parse(dateEnd);
    Date date2 = formater.parse(dateInit);

    String result = substractDates(date1, date2, new SimpleDateFormat("HH:mm:ss"));

    txtTime.setText(result);
} catch (ParseException e) {
    e.printStackTrace();
}
Melquiades
  • 8,496
  • 1
  • 31
  • 46
Exensor
  • 11
  • 5
0

When you use Date() to calculate the difference in hours is necessary configure the SimpleDateFormat() in UTC otherwise you get one hour error due to Daylight SavingTime.

coatless
  • 20,011
  • 13
  • 69
  • 84