28
votes

I want to display the difference between two times in hh:mm format.

The first time is from a database and the second time is the system time. Time difference is updated every second.

How can I do that?

Currently I'm using two manual time if this works perfectly then I implement it into my apps.

public class MainActivity extends Activity 
{
    TextView mytext;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timer updateTimer = new Timer();
        updateTimer.schedule(new TimerTask() 
        {
            public void run() 
            {
                try 
                {
                    TextView txtCurrentTime= (TextView)findViewById(R.id.mytext);
                    SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
                    Date date1 = format.parse("08:00:12 pm");
                    Date date2 = format.parse("05:30:12 pm");
                    long mills = date1.getTime() - date2.getTime();
                    Log.v("Data1", ""+date1.getTime());
                    Log.v("Data2", ""+date2.getTime());
                    int hours = (int) (mills/(1000 * 60 * 60));
                    int mins = (int) (mills % (1000*60*60));

                    String diff = hours + ":" + mins; // updated value every1 second
                    txtCurrentTime.setText(diff);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }

        }, 0, 1000);
    }
}
9
Are the one from the database a String or Date instance?JustDanyul
What is the magnitude of the difference (seconds, milliseconds, days...)?assylias
Have you tried something already?Egor
@assylias i need in hh:mm format for example 11:05 am - 12:30 pm = 01:25Niks
@JustDanyul String instanceNiks

9 Answers

47
votes

To Calculate the difference between two dates you could try something like:

long millis = date1.getTime() - date2.getTime();
int hours = (int) (millis / (1000 * 60 * 60));
int mins = (int) ((millis / (1000 * 60)) % 60);

String diff = hours + ":" + mins; 

To update the Time Difference every second you can make use of Timer.

Timer updateTimer = new Timer();
updateTimer.schedule(new TimerTask() {
    public void run() {
        try {
            long mills = date1.getTime() - date2.getTime();
                int hours = millis/(1000 * 60 * 60);
                 int mins = (mills/(1000*60)) % 60;

                 String diff = hours + ":" + mins; // updated value every1 second
            } catch (Exception e) {
            e.printStackTrace();
        }
    }

}, 0, 1000); // here 1000 means 1000 mills i.e. 1 second

Edit : Working Code :

public class MainActivity extends Activity {

    private TextView txtCurrentTime;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtCurrentTime= (TextView)findViewById(R.id.mytext);
        Timer updateTimer = new Timer();
        updateTimer.schedule(new TimerTask() 
        {
            public void run() 
            {
                try 
                {
                    
                    SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");
                    Date date1 = format.parse("08:00:12 pm");
                    Date date2 = format.parse("05:30:12 pm");
                    long mills = date1.getTime() - date2.getTime();
                    Log.v("Data1", ""+date1.getTime());
                    Log.v("Data2", ""+date2.getTime());
                    int hours = (int) (mills/(1000 * 60 * 60));
                    int mins = (int) (mills/(1000*60)) % 60;

                    String diff = hours + ":" + mins; // updated value every1 second
                    txtCurrentTime.setText(diff);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }

        }, 0, 1000);
    }
9
votes

finally did it yuppiiieee ...

package com.timedynamicllyupdate;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity 
{
    TextView current;
    private TextView txtCurrentTime;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Thread myThread = null;
        Runnable myRunnableThread = new CountDownRunner();
        myThread= new Thread(myRunnableThread);   
        myThread.start();

        current= (TextView)findViewById(R.id.current);
    }


    public void doWork() 
    {
        runOnUiThread(new Runnable() 
        {
            public void run() 
            {
                try
                {
                    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss aa");

                    txtCurrentTime= (TextView)findViewById(R.id.mytext);

                    Date systemDate = Calendar.getInstance().getTime();
                    String myDate = sdf.format(systemDate);
//                  txtCurrentTime.setText(myDate);

                    Date Date1 = sdf.parse(myDate);
                    Date Date2 = sdf.parse("02:50:00 pm");

                    long millse = Date1.getTime() - Date2.getTime();
                    long mills = Math.abs(millse);

                    int Hours = (int) (mills/(1000 * 60 * 60));
                    int Mins = (int) (mills/(1000*60)) % 60;
                    long Secs = (int) (mills / 1000) % 60;

                    String diff = Hours + ":" + Mins + ":" + Secs; // updated value every1 second
                    current.setText(diff);
                }
                catch (Exception e) 
                {

                }
            }
        });
    }

    class CountDownRunner implements Runnable
    {
        // @Override
        public void run() 
        {
            while(!Thread.currentThread().isInterrupted())
            {
                try 
                {
                    doWork();
                    Thread.sleep(1000); // Pause of 1 Second
                } 
                catch (InterruptedException e) 
                {
                        Thread.currentThread().interrupt();
                }
                catch(Exception e)
                {
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}
7
votes

Using java.time

The modern way is with the java.time classes that supplant the troublesome old date-time classes.

The LocalTime class represents a time-of-day without a date and without a time zone.

Define a formatting pattern with DateTimeFormatter class.

String inputStart = "08:00:12 pm".toUpperCase() ;
String inputStop = "05:30:12 pm".toUpperCase() ;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "hh:mm:ss a" );
LocalTime start = LocalTime.parse( inputStart , f );
LocalTime stop = LocalTime.parse( inputStop , f );

start.toString(): 20:00:12

stop.toString(): 17:30:12

The LocalTime class works within a single generic 24-hour day. So it does not consider crossing midnight. If you want to cross over between days you should be using ZonedDateTime, OffsetDateTime, or LocalDateTime instead, all date-time objects rather than time-of-day-only.

A Duration captures a span of time unattached to the timeline.

Duration d = Duration.between( start , stop );

Calling toString generates text in the standard ISO 8601 format for durations: PnYnMnDTnHnMnS where the P marks the beginning and the T separates the years-months-days from the hours-minutes-seconds. I strongly recommend using this format rather than "HH:MM:SS" format that is ambiguous with clock-time.

If you insist on using the ambiguous clock-time format, in Java 9 and later you can build that string by calling toHoursPart, toMinutesPart, and toSecondsPart.

In your example data we are moving backwards in time, going from 8 PM to 5 PM, so the result is a negative number of hours and minutes, a negative two and a half hours.

d.toString(): PT-2H-30M

See this code run live at IdeOne.com.


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

4
votes

OK I Build here Funcion for you:

 public void omriFunction(){
    Date Start = null;
    Date End = null;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
    try {
        Start = simpleDateFormat.parse(04+":"+30);
        End = simpleDateFormat.parse(06+":"+45);}
    catch(ParseException e){
        //Some thing if its not working
    }

    long difference = End.getTime() - Start.getTime();
    int days = (int) (difference / (1000*60*60*24));
    int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60));
    int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
    if(hours < 0){
        hours+=24;
    }if(min < 0){
        float  newone = (float)min/60 ;
        min +=60;
        hours =(int) (hours +newone);}
    String c = hours+":"+min;
    Log.d("ANSWER",c);}

ANSWER :2:15; in the logcat

2
votes

The process is roughly as follows,

  1. Convert your string instance to a date instance the following way

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = format.parse("2011-01-03");
    
  2. Assuming the systemTime you have is a long, representing miliseconds since the epoc, you can now do the following

    long difference = longNow - date.getTime();
    int msPerHour = 1000*60*60;
    int hours = difference/secondPerHour;
    int minutes = difference % secondPerHour;
    

    where longNow is your current variable containing system time.

1
votes
Date currentTime = parseDate("11:27:20 AM");
Date endTime = parseDate("10:30:01 AM");

if (endTime.before(currentTime))
{
    Log.e("Time :","===> is before from current time");
}

if (endTime.after(currentTime))
{
    Log.e("Time :","===> is after from current time");
}



private Date parseDate(String date)
{
    String inputFormat = "hh:mm:ss aa";
    SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
    try {
        return inputParser.parse(date);
    } catch (java.text.ParseException e) {
        return new Date(0);
    }
}
0
votes

Hi Guys not sure what I was doing wrong , but this helped for me , hope I can help someone else out.

My min were being calculated in some float format so I used this formula

long Min = time %  (1000*60*60)/(60*1000);
time is my date2.getTime() - date1.getTime();

Happy coding

0
votes

Tray The following code to get hour and minute different between two times:

private static int getHoursDiff(Calendar c1, Calendar c2) {
            Date d1 = c1.getTime();
            Date d2 = c2.getTime();
            long mils = d1.getTime() - d2.getTime();
            int hourDiff = (int) (mils / (1000 * 60 * 60));
            return hourDiff;
        }

        private static int getMinuteDiff(Calendar c1, Calendar c2) {
            Date d1 = c1.getTime();
            Date d2 = c2.getTime();
            long mils = d1.getTime() - d2.getTime();
            int minuteFor = (int) (mils / (1000 * 60) % 60);
            return minuteFor;
        } }
0
votes

So I was hunting around for a way where I could get HH/MM/SS from 2 Times in Kolin and this seems like a nice way to do it.

It uses import org.threeten.bp

fun getTimedifference(startTime: LocalDateTime,  endTime: LocalDateTime): String {
        val startTimeInstant = startTime.atOffset(ZoneOffset.UTC).toInstant()
        val endTimeInstant = endTime.atOffset(ZoneOffset.UTC).toInstant()
        val duration = Duration.between(startTimeInstant, endTimeInstant)
        val days = duration.toDays()
        val hours = duration.toHours() - (days * 24)
        val min = duration.toMinutes() - (duration.toHours() * 60)
        val sec = (duration.toMillis() / 1000) - (duration.toMinutes() * 60)
        return "${hours}:${min}:${sec}"
    }