Calculate Difference between two times in Android

后端 未结 7 2075
-上瘾入骨i
-上瘾入骨i 2020-11-27 21:47

I have two string variables such as StartTime and EndTime. I need to Calculate the TotalTime by subtracting the EndTime with StartTime.

The Format of StartTime and E

相关标签:
7条回答
  • 2020-11-27 22:09
    Try simple piece of code using For 24 hour time
    StartTime = "10:00";
    EndTime = "13:00";
    here starthour=10 and end hour=13 
    if(TextUtils.isEmpty(txtDate.getText().toString())||TextUtils.isEmpty(txtDate1.getText().toString())||TextUtils.isEmpty(txtTime.getText().toString())||TextUtils.isEmpty(txtTime1.getText().toString()))
        {
            Toast.makeText(getApplicationContext(), "Date/Time fields cannot be blank", Toast.LENGTH_SHORT).show();
        }
        else {
            if (starthour > endhour) {
                Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
            } else if (starthour == endhour) {
                if (startmin > endmin) {
                    Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show();
                }
                else{
                    tvalid = "True";
                }
            } else {
                // Toast.makeText(getApplicationContext(),"Sucess"+(endhour-starthour)+(endmin-startmin),Toast.LENGTH_SHORT).show();
                tvalid = "True";
            }
        }
    same for date also
    
    0 讨论(0)
  • 2020-11-27 22:16

    Note: Corrected code as below which provide by Chirag Raval because in code which Chirag provided had some issues when we try to find time from 22:00 to 07:00.

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
    Date startDate = simpleDateFormat.parse("22:00");
    Date endDate = simpleDateFormat.parse("07:00");
    
    long difference = endDate.getTime() - startDate.getTime(); 
    if(difference<0)
    {
        Date dateMax = simpleDateFormat.parse("24:00");
        Date dateMin = simpleDateFormat.parse("00:00");
        difference=(dateMax.getTime() -startDate.getTime() )+(endDate.getTime()-dateMin.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);
    Log.i("log_tag","Hours: "+hours+", Mins: "+min); 
    

    Result will be: Hours: 9, Mins: 0

    0 讨论(0)
  • 2020-11-27 22:17

    I should like to contribute the modern answer.

    java.time and ThreeTenABP

        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
    
        String startTime = "08:00 AM";
        String endTime = "04:00 PM";
    
        LocalTime start = LocalTime.parse(startTime, timeFormatter);
        LocalTime end = LocalTime.parse(endTime, timeFormatter);
    
        Duration diff = Duration.between(start, end);
    
        long hours = diff.toHours();
        long minutes = diff.minusHours(hours).toMinutes();
        String totalTimeString = String.format("%02d:%02d", hours, minutes);
        System.out.println("TotalTime in Hours and Mins Format is " + totalTimeString);
    

    The output from this snippet is:

    TotalTime in Hours and Mins Format is 08:00

    (Tested on Java 1.7.0_67 with ThreeTen Backport.)

    The datetime classes used in the other answers — SimpleDateFormat, Date, DateFormat and Calendar — are all long outdated and poorly designed. Possibly worse, one answer is parsing and calculating “by hand”, without aid from any library classes. That is complicated and error-prone and never recommended. Instead I am using java.time, the modern Java date and time API. It is so much nicer to work with.

    Question: Can I use java.time on Android?

    Yes, java.time works nicely on older and newer Android devices. It just requires at least Java 6.

    • In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.
    • In Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom).
    • On (older) Android use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from org.threeten.bp with subpackages: org.threeten.bp.Duration, org.threeten.bp.LocalTime and org.threeten.bp.format.DateTimeFormatter.

    Links

    • Oracle tutorial: Date Time explaining how to use java.time.
    • Java Specification Request (JSR) 310, where java.time was first described.
    • ThreeTen Backport project, the backport of java.time to Java 6 and 7 (ThreeTen for JSR-310).
    • ThreeTenABP, Android edition of ThreeTen Backport
    • Question: How to use ThreeTenABP in Android Project, with a very thorough explanation.
    0 讨论(0)
  • 2020-11-27 22:26
    String mStrDifferenceTime =compareTwoTimeAMPM("11:06 PM","05:07 AM");
    Log.e("App---Time ", mStrDifferenceTime+" Minutes");
    
    public static String getCurrentDateUsingCalendar() {
        Date mDate = new Date();  // to get the date
        @SuppressLint("SimpleDateFormat") SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("dd-MM-yyyy"); // getting date in this format
        return mSimpleDateFormat.format(mDate.getTime());
    }
    
    public static String getNextDateUsingCalendar() {
        Calendar mCalendar = Calendar.getInstance();
        mCalendar.add(Calendar.DAY_OF_YEAR, 1);
        Date mStrTomorrow = mCalendar.getTime();
        @SuppressLint("SimpleDateFormat") DateFormat mDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return mDateFormat.format(mStrTomorrow);
    
    }
    
    public static String compareTwoTimeAMPM(String mStrStartTime, String mStrEndTime) {
        String mStrCompareStartTime[] = mStrStartTime.split(" ");
        String mStrCompareEndTime[] = mStrEndTime.split(" ");
        int mIStartTime = Integer.parseInt(mStrCompareStartTime[0].replace(":", ""));
        int mIEndTime = Integer.parseInt(mStrCompareEndTime[0].replace(":", ""));
        String mStrToday = "";
        String mStrTomorrow = "";
        if (mIStartTime < mIEndTime && mStrCompareStartTime[1].equals("PM") && mStrCompareEndTime[1].equals("PM")) {
            mStrToday = getCurrentDateUsingCalendar();
            mStrTomorrow = getCurrentDateUsingCalendar();
        } else if (mIStartTime < mIEndTime && mStrCompareStartTime[1].equals("AM") && mStrCompareEndTime[1].equals("AM")) {
            mStrToday = getCurrentDateUsingCalendar();
            mStrTomorrow = getCurrentDateUsingCalendar();
        } else if (mIStartTime > mIEndTime && mStrCompareStartTime[1].equals("PM") && mStrCompareEndTime[1].equals("PM")) {
            String mStrTime12[] = mStrCompareStartTime[0].split(":");
            if (mStrTime12[0].equals("12")) {
                mStrToday = getNextDateUsingCalendar();
                mStrTomorrow = getNextDateUsingCalendar();
            } else {
                mStrToday = getCurrentDateUsingCalendar();
                mStrTomorrow = getNextDateUsingCalendar();
            }
        } else if (mIStartTime > mIEndTime && mStrCompareStartTime[1].equals("AM") && mStrCompareEndTime[1].equals("AM")) {
            String mStrTime12[] = mStrCompareStartTime[0].split(":");
            if (mStrTime12[0].equals("12")) {
                mStrToday = getNextDateUsingCalendar();
                mStrTomorrow = getNextDateUsingCalendar();
            } else {
                mStrToday = getCurrentDateUsingCalendar();
                mStrTomorrow = getNextDateUsingCalendar();
            }
        } else if (mStrCompareStartTime[1].equals("PM") && mStrCompareEndTime[1].equals("AM")) {
            mStrToday = getCurrentDateUsingCalendar();
            mStrTomorrow = getNextDateUsingCalendar();
        } else if (mStrCompareStartTime[1].equals("AM") && mStrCompareEndTime[1].equals("PM")) {
            mStrToday = getCurrentDateUsingCalendar();
            mStrTomorrow = getCurrentDateUsingCalendar();
        }
        @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm aa");
        String mStrDifference = "";
        try {
            Date date1 = simpleDateFormat.parse(mStrToday + " " + mStrStartTime);
            Date date2 = simpleDateFormat.parse(mStrTomorrow + " " + mStrEndTime);
            mStrDifference = differenceDatesAndTime(date1, date2);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        return mStrDifference;
    
    }
    
    
    public static String differenceDatesAndTime(Date mDateStart, Date mDateEnd) {
    
        long different = mDateEnd.getTime() - mDateStart.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;
    
        long minutes = elapsedHours * 60 + elapsedMinutes;
        long result = elapsedDays * 24 * 60 + minutes;
        if (0 > result) {
            result = result + 720;  //result is minus then add 12*60 minutes
        }
    
        return result + "";
    }
    

    My output is E/App---Time: 361 Minutes

    0 讨论(0)
  • 2020-11-27 22:30

    Please try this....

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
    
        try {
            date1 = simpleDateFormat.parse("08:00 AM");
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        try {
            date2 = simpleDateFormat.parse("04:00 PM");
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        long difference = date2.getTime() - date1.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);
        hours = (hours < 0 ? -hours : hours);
        Log.i("======= Hours", " :: " + hours);
    
    0 讨论(0)
  • 2020-11-27 22:31

    Try below code.

    // suppose time format is into ("hh:mm a") format

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm a");
    
    date1 = simpleDateFormat.parse("08:00 AM");
    date2 = simpleDateFormat.parse("04:00 PM");
    
    long difference = date2.getTime() - date1.getTime(); 
    days = (int) (difference / (1000*60*60*24));  
    hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); 
    min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
    hours = (hours < 0 ? -hours : hours);
    Log.i("======= Hours"," :: "+hours);
    

    Output - Hours :: 8

    0 讨论(0)
提交回复
热议问题