【问题标题】:Calculate Difference between two times in Android在Android中计算两次之间的差异
【发布时间】:2012-12-16 03:29:35
【问题描述】:

我有两个字符串变量,例如 StartTime 和 EndTime。我需要用 StartTime 减去 EndTime 来计算 TotalTime。

StartTime和EndTime的格式如下:

StartTime = "08:00 AM";
EndTime = "04:00 PM";

以小时和分钟格式表示的总时间。在 Android 中如何计算?

【问题讨论】:

标签: java android date time


【解决方案1】:

试试下面的代码。

//假设时间格式为("hh:mm a")格式

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);

输出 - 小时 :: 8

【讨论】:

  • 嘿,谢谢你,差异总是负数,我的开始时间是下午 12:30,结束时间是下午 1:00。我给它的格式是“HH:mm a”,但差异仍然是负数。虽然结束时间大于开始时间。
  • 我还需要用字符串给出日期吗?
  • 使用 01:00 PM 而不是 1:00 PM 并尝试发生了什么。
  • 我都试过了,但小时差是负数,即使我尝试上午 08:00 和下午 04:00,它也会返回分钟和小时为 0.0。我正在这样做 SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("HH:mm a");日期 date1 = simpleDateFormat.parse("08:00 AM");日期 date2 = simpleDateFormat.parse("04:00 PM");长差 = date1.getTime() - date2.getTime(); int 天数 = (int) (差值 / (1000*60*60*24)); int hours = (int) ((差异 - (1000*60*60*24*days)) / (1000*60*60)); int min = (int) (差 - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);
  • 不需要像这样推出自己的解决方案。现代的 java.time 类可以处理这项工作并进行数学计算。见this other Answer
【解决方案2】:

注意:更正了 Chirag Raval 提供的代码如下,因为当我们尝试从 22:00 到 07:00 查找时间时,Chirag 提供的代码存在一些问题。

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); 

结果将是:小时:9,分钟:0

【讨论】:

  • 嗨,如何以与上述相同的格式(分钟,小时)获得秒数?
【解决方案3】:

看看DateFormat,你可以用它用parse(String source)方法来解析你的字符串,你可以很容易地操纵两个日期对象来获得你想要的。

DateFormat df = DateFormat.getInstance();
Date date1 = df.parse(string1);
Date date2 = df.parse(string2);
long difference = date1.getTime() - date2.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);

String diffHours = df.format(hours);

日期差异

Date myDate = new Date(difference);

显示日期:

String diff = df.format(myDate);

【讨论】:

  • 嗨 Rahul,如何以与上述相同的格式(分钟、小时)获得秒数?
【解决方案4】:

请试试这个....

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);

【讨论】:

  • 嗨,如何以与上述相同的格式(分钟,小时)获得秒数?
【解决方案5】:

我想提供现代答案。

java.time 和 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);

这个 sn-p 的输出是:

以小时和分钟为单位的总时间格式为 08:00

(使用 ThreeTen Backport 在 Java 1.7.0_67 上测试。)

其他答案中使用的日期时间类——SimpleDateFormatDateDateFormatCalendar——都早已过时且设计不佳。可能更糟糕的是,一个答案是“手动”解析和计算,而无需任何库类的帮助。这是复杂且容易出错的,从不推荐。相反,我使用的是现代 Java 日期和时间 API java.time。使用起来感觉好多了。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类,并带有子包:org.threeten.bp.Durationorg.threeten.bp.LocalTimeorg.threeten.bp.format.DateTimeFormatter

链接

【讨论】:

    【解决方案6】:
    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 + "";
    }
    

    我的输出是 E/App---时间:361 分钟

    【讨论】:

      【解决方案7】:
      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
      

      【讨论】:

        猜你喜欢
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        相关资源
        最近更新 更多