час и мин в формате Java

Мне нужно отформатировать строку времени следующим образом:

int time = 160;

Вот мой пример кода:

public static String formatDuration(String minute) {
    String formattedMinute = null;
    SimpleDateFormat sdf = new SimpleDateFormat("mm");
    try {
        Date dt = sdf.parse(minute);
        sdf = new SimpleDateFormat("HH mm");
        formattedMinute = sdf.format(dt);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return formattedMinute;
//        int minutes = 120;
//        int h = minutes / 60 + Integer.parseInt(minute);
//        int m = minutes % 60 + Integer.parseInt(minute);
//        return h + "hr " + m + "mins";
}

Мне нужно отобразить его как 2 часа 40 минут. Но я понятия не имею, как добавить «часы» и «минуты». Требование состоит в том, чтобы не использовать какую-либо библиотеку.

Если вы делали что-то подобное в прошлом, не стесняйтесь помочь. Огромное спасибо!


person bEtTy Barnes    schedule 18.05.2018    source источник
comment
Что представляет собой time? В каких единицах оно указано? Единицы длинного счета майя?   -  person ifly6    schedule 18.05.2018
comment
Возможно, вам будет полезно узнать о создании и анализе стандартных строк ISO 8601 для продолжительности с помощью класс java.time.Duration.   -  person Basil Bourque    schedule 19.05.2018
comment
К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими, вытесненными java.time, встроенные в Java 8 и более поздние версии. См. учебник от Oracle.   -  person Basil Bourque    schedule 19.05.2018
comment
@ifly6 минут братан   -  person bEtTy Barnes    schedule 19.05.2018
comment
Возможный дубликат Как преобразовать миллисекунды в «X мин, х секунд» в Java? Есть много других подобных вопросов и ответов, пожалуйста, используйте свою поисковую систему.   -  person Ole V.V.    schedule 20.05.2018


Ответы (3)


Поскольку сейчас 2018 год, вам действительно следует использовать библиотеки Date/Time, представленные в Java 8.

String minutes = "160";
Duration duration = Duration.ofMinutes(Long.parseLong(minutes));

long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();

// Or if you're lucky enough to be using Java 9+
//String formatted = String.format("%dhrs %02dmins", duration.toHours(), duration.toMinutesPart());
String formatted = String.format("%dhrs %02dmins", hours, mins);
System.out.println(formatted);

Какие выходы...

2hrs 40mins

Зачем использовать что-то подобное? Помимо общего улучшения API, что происходит, когда minutes равно чему-то вроде 1600?

Вместо того, чтобы печатать 2hrs 40mins, выше будет отображаться 26hrs 40mins. SimpleDateFormat форматирует значения даты/времени, но не имеет отношения к длительности

person MadProgrammer    schedule 18.05.2018
comment
Спасибо за это! Но требование не использовать какую-либо библиотеку. Вместо этого я буду использовать этот образец, который вы предоставили, в своих производственных приложениях. - person bEtTy Barnes; 19.05.2018
comment
@bEtTyBarnes Какая библиотека? Чем это отличается от использования SimpleDateFormat? Это часть основного API - person MadProgrammer; 20.05.2018
comment
@bEtTyBarnes Пожалуйста, объясните это требование более точно в своем вопросе. Кажется, это важное ограничение. Как насчет встроенных стандартных библиотек в Java? - person Ole V.V.; 20.05.2018
comment
Если i18n важен, я рекомендую использовать средство форматирования с учетом локали, такое как DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()) - person gb96; 03.11.2019
comment
@gb96 gb96 Согласен, это одна из наиболее важных причин использования средства форматирования, но я не знаю, поддерживает ли DateFormat продолжительность форматирования (потому что, что такое 28 часов в любом случае?) - person MadProgrammer; 03.11.2019

Просто попробуй

sdf = new SimpleDateFormat("HH 'hrs' mm 'mins'");

Существует хорошая документация https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html Из документа:

«Текст можно заключать в одинарные кавычки ('), чтобы избежать интерпретации».

person Simons0n    schedule 18.05.2018
comment
Ой! Я не знал, что в нем можно поставить одинарные кавычки. - person bEtTy Barnes; 19.05.2018
comment
Что происходит, когда ввод становится "1600"? Этот подход сломает - person MadProgrammer; 19.05.2018

Другой простой подход может быть чем-то вроде:

public static String formatDuration(String minute){
    int minutes = Integer.parseInt(minute);

    int hours = minutes / 60;
    minutes = minutes % 60;

    return hours + "hrs " + minutes + "mins.";
}
person Niki E. Z.    schedule 18.05.2018
comment
Создание собственного кода даты и времени, как правило, плохой совет. У нас есть отличные доступные классы java.time; используй их. См. правильный ответ от MadProgrammer. - person Basil Bourque; 19.05.2018