Преобразовать поле времени H: M в целочисленное поле (минуты) в JAVA - PullRequest
3 голосов
/ 18 января 2012

JTable содержит поле времени, например, «01:50».Мне нужно прочитать это значение в целочисленной переменной.Для этого я бы хотел перевести время в минуты.Например, «01:50» следует преобразовать в 110.

Чтобы решить задачу, сначала я сохранил значение времени в виде строки.

String minutS = tableModel.getValueAt(1,1).toString();

Во-вторых, я собираюсь обработать эту строку и извлечь целые числа до и после символа :.Наконец я подсчитаю общее количество минут.Эффективно ли это решение?Возможно, можно заменить его на Calendar или что-то подобное?

Ответы [ 5 ]

15 голосов
/ 18 января 2012

Я не думаю, что использование календаря / даты будет лучше, чем простой анализ в этом случае.Если ваш формат времени действительно H: m, то я не думаю, что вам нужно что-то более сложное, чем это:

/**
 * @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;
}
2 голосов
/ 18 января 2012

Как насчет этого:

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 */
1 голос
/ 18 января 2012

Посмотрите образец ниже, который мы используем в нашем приложении

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 голосов
/ 25 сентября 2017

Начиная с Java 1.8, наиболее элегантным решением, вероятно, является:

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

0 голосов
/ 18 января 2012

Уберите ваш ввод перед обработкой. (commons-lang utils)

пробелы могут вызвать NumberFormatExceptions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...