Convert time field H:M into integer field (minutes) in JAVA

后端 未结 5 872
名媛妹妹
名媛妹妹 2021-01-06 14:25

The JTable includes the time field, e.g. \"01:50\". I need to read this value into the integer variable. For this I´d like to convert time into minutes. For instance \"01:50

相关标签:
5条回答
  • 2021-01-06 14:44

    Look the sample below which we are using in our application

    public static int toMinutes( String sDur, boolean bAssumeMinutes ) throws NumberFormatException {
            /* Use of regular expressions might be better */
            int iMin = 0;
            int iHr = 0;
            sDur = sDur.trim();
            //find punctuation
            int i = sDur.indexOf(":");//HH:MM
            if (i < 0) {
                //no punctuation, so assume whole thing is an number
                //double dVal = Double.parseDouble(sDur);
                double dVal = ParseAndBuild.parseDouble(sDur, Double.NaN);
                if (Double.isNaN(dVal)) throw new NumberFormatException(sDur);
                if (!bAssumeMinutes) {
                    //decimal hours so add half a minute then truncate to minutes
                    iMin = (int)((dVal * 60.0) + (dVal < 0 ? -0.5 : 0.5));
                } else {
                    iMin = (int)dVal;
                }
            }
            else {
                StringBuffer sBuf = new StringBuffer(sDur);
                int j = sBuf.indexOf(MINUS_SIGN);
                //check for negative sign
                if (j >= 0) {
                    //sign must be leading/trailing but either allowed regardless of MINUS_SIGN_TRAILS
                    if (j > 0 && j < sBuf.length() -1)
                        throw new NumberFormatException(sDur);                  
                    sBuf.deleteCharAt(j);
                    i = sBuf.indexOf(String.valueOf(":"));
                }
                if (i > 0)
                    iHr = Integer.parseInt(sBuf.substring(0, i)); //no thousands separators allowed
                if (i < sBuf.length() - 1)
                    iMin = Integer.parseInt(sBuf.substring(i+1));
                if (iMin < 0 || (iHr != 0 && iMin >= 60))
                    throw new NumberFormatException(sDur);
                iMin += iHr * 60;
                if (j >= 0) iMin = -iMin;
            }
            return iMin;
        }
    
    0 讨论(0)
  • 2021-01-06 14:48

    Strip your input before processing it. (commons-lang utils)

    spaces can make NumberFormatExceptions occur.

    0 讨论(0)
  • 2021-01-06 15:00

    Since java 1.8 the most elegant solution is probably:

    long minutes = ChronoUnit.MINUTES.between(LocalTime.MIDNIGHT, LocalTime.parse("01:50"));

    0 讨论(0)
  • 2021-01-06 15:01

    How about this:

    String time = "1:50";
    String[] split = time.split(":"); 
    if(split.length == 2) { 
            long minutes = TimeUnit.HOURS.toMinutes(Integer.parseInt(split[0])) + 
                             Integer.parseInt(split[1]);
            System.out.println(minutes);
        }
    
    /* Output: 110 */
    
    0 讨论(0)
  • 2021-01-06 15:06

    I don't think using Calendar/Date will be better than straightforward parse for this case. If your time format is indeed H:m, then I don't think you need anything more complex than this:

    /**
     * @param s H:m timestamp, i.e. [Hour in day (0-23)]:[Minute in hour (0-59)]
     * @return total minutes after 00:00
     */
    private static int toMins(String s) {
        String[] hourMin = s.split(":");
        int hour = Integer.parseInt(hourMin[0]);
        int mins = Integer.parseInt(hourMin[1]);
        int hoursInMins = hour * 60;
        return hoursInMins + mins;
    }
    
    0 讨论(0)
提交回复
热议问题