Java:как преобразовать строку (HH:MM: SS) в длительность?

Я хочу преобразовать строку с форматом HH: MM:SS или MM: SS или SS в тип данных длительности.

устранение:

    private ArrayList<Duration> myCdDuration = new ArrayList<Duration>();

        private void convert(String aDuration) {

            chooseNewDuration(stringToInt(splitDuration(aDuration))); //stringToInt() returns an int[] and splitDuration() returns a String[]
        }

        private void chooseNewDuration(int[] array) {
            int elements = array.length;
            switch (elements) {
            case 1:
                myCdDuration.add(newDuration(true, 0, 0, 0, 0, 0, array[0]));
                break;
            case 2:
                myCdDuration.add(newDuration(true, 0, 0, 0, 0, array[0], array[1]));
                break;
            case 3:
                myCdDuration.add(newDuration(true, 0, 0, 0, array[0], array[1],
                        array[2]));
                break;
            }
        }

спасибо за помощь ... есть более простой способ сделать это ? - >создайте свой собственный класс продолжительности:

public class Duration {
        private int intSongDuration;
        private String printSongDuration;

        public String getPrintSongDuration() {
            return printSongDuration;
        }

        public void setPrintSongDuration(int songDuration) {
            printSongDuration = intToStringDuration(songDuration);
        }

        public int getIntSongDuration() {
            return intSongDuration;
        }

        public void setIntSongDuration(int songDuration) {
            intSongDuration = songDuration;
        }

        public Duration(int songDuration) {

            setIntSongDuration(songDuration);
        }

преобразует значение типа int в строку для вывода/печати:

private String intToStringDuration(int aDuration) {
    String result = "";

    int hours = 0, minutes = 0, seconds = 0;

    hours = aDuration / 3600;
    minutes = (aDuration - hours * 3600) / 60;
    seconds = (aDuration - (hours * 3600 + minutes * 60));

    result = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    return result;
}

7 ответов


  1. код myCdDuration сбивает с толку. Вы хотите один Duration объект, эквивалентный тому, что было указано в строке, или список Duration объекты, где первый содержит часы, второй минуты и т. д.?

  2. вы не можете просто бросить String в какой-то другой объект. Вы должны проанализировать значение в числовой тип и использовать DataTypeFactory построить


Я предполагаю, что вы в конечном итоге пытаетесь достичь, чтобы вычислить продолжительность компакт-диска в секундах.

есть несколько способов сделать это, но я думаю, что проще всего просто разделить на : чтобы получить поля часов, минут и секунд, а затем вычислить продолжительность вручную:

String timestampStr = "14:35:06";
String[] tokens = timestampStr.split(":");
int hours = Integer.parseInt(tokens[0]);
int minutes = Integer.parseInt(tokens[1]);
int seconds = Integer.parseInt(tokens[2]);
int duration = 3600 * hours + 60 * minutes + seconds;

tl; dr

нет необходимости определять свой собственный Duration класс, поскольку Java предоставляет один.

Duration.between (                  // Represent a span of time of hours, minutes, seconds. 
    LocalTime.MIN ,                 // 00:00:00
    LocalTime.parse ( "08:30:00" )  // Parse text as a time-of-day. 
)                                   // Returns a `Duration` object, a span-of-time. 
.toString()                         // Generate a `String` with text in standard ISO 8601 format. 

PT8H30M

и анализировать стандартный форматированный текст ISO 8601.

Duration.parse( "PT8H30M" )   // Parse standard ISO 8601 text yo get a `Duration` object. 

избежать , теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, см. Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

где получить java.время занятий?

  • Java SE 8 и SE 9 и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и зафиксировать.
  • Java SE 6 и SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы здесь такие как Interval, YearWeek, YearQuarter и больше.


Я написал этот метод в своем классе utils для анализа различного рода строк длительности. Он довольно гибкий:

public static int getSecondsFromFormattedDuration(String duration){
        if(duration==null)
            return 0;
        try{

            Pattern patternDuration = Pattern.compile("\d+(?::\d+){0,2}");

            int hours = 0;
            int minutes = 0;
            int seconds = 0;
            if(patternDuration.matcher(duration).matches()){
                String[] tokens = duration.split(":");
                if(tokens.length==1){
                    seconds = Integer.parseInt(tokens[0]);
                }else if(tokens.length == 2){
                    minutes = Integer.parseInt(tokens[0]);
                    seconds = Integer.parseInt(tokens[1]);
                }else{
                    hours = Integer.parseInt(tokens[0]);
                    minutes = Integer.parseInt(tokens[1]);
                    seconds = Integer.parseInt(tokens[2]);
                }

                return 3600 * hours + 60 * minutes + seconds;
            }else
                return 0;

        }catch (NumberFormatException ignored){
            return 0;
        }

}

вот как он проанализировал эти длительности:

"1"   -->  1
"10"  -->  10
"10:"   -->  0  (not a valid duration)
"10:07"   -->  607
"06:08"   -->  368
"7:22"   -->  442
":22"   -->  0  (not a valid duration)
"10:32:33"   -->  37953
"2:33:22"   -->  9202
"2:2:02"   -->  7322
"2:33:43:32"   -->  0  (not a valid duration)
"33ff"   -->  0  (not a valid duration)
"2d:33"   -->  0  (not a valid duration)

Я бы предложил не используя javax.xml.datatype.Duration, Как это связано с XML Java API, и это запутанно использовать его, если вы не имеете дело с XML. Более того, это абстрактный класс, и в Java SE нет его неабстрактной документированной реализации, поэтому вам придется либо создать свою собственную неабстрактную реализацию, либо получить экземпляр каким-то образом (возможно, играя с XML API).

вы управляете временем и датами в Java, используя Date и Calendar классы. К преобразовать Strings до Date/Calendar вы используете DateFormat или SimpleDateFormat. Это позволит вам выполнить арифметику продолжительности, хотя это не на 100% красиво.

Mansoor предоставляет способ делать вещи вручную, используя манипуляции со строками и обработку длительностей в качестве числовых значений - если вы делаете только простые вещи, это может быть проще сделать.

Если вам нужно выполнить более сложные вещи, вы можете посмотреть в http://joda-time.sourceforge.net/


С Java 8 и Java.время.Продолжительность вы можете сделать это, учитывая, что строка имеет формат HH: MM:SS или MM: SS или SS

Duration.ofSeconds(Arrays.stream(runtime.split(":"))
                  .mapToInt(n -> Integer.parseInt(n))
                  .reduce(0, (n, m) -> n * 60 + m));

пример, преобразует текущее время DateTime в Длительность в Java 7.

DatatypeFactory.newInstance().newDuration(Calendar.getInstance().getTimeInMillis())

выход -

P48Y5M13DT19H59M24.658S