Преобразование дней, минут, часов в секунды в Java с использованием объекта Duration

Продолжительность викторины указывается в днях, часах и минутах целыми числами.

Я пытаюсь преобразовать их комбинацию в секунды. Ниже код, который я пробовал. но он всегда возвращает 0 секунд. Я использую jdk 6

Integer hours = 3, days=4, minutes=20;
javax.xml.datatype.Duration duration = DatatypeFactory.newInstance().newDuration(true, 0, 0, 
                    days, 
                    hours, 
                    minutes, 
                    0);  
Integer seconds = duration.getSeconds(); // It always returns zero

Пожалуйста, направляйте.


person stack_user60    schedule 26.11.2019    source источник
comment
Является ли Duration java.time.Duration? Похоже, что секунд не вернуть, что возвращает duration.getMinutes()? Это 20?   -  person deHaar    schedule 26.11.2019
comment
Продолжительность равна javax.xml.datatype.Duration, и да, она возвращает 20 минут. в основном я хочу преобразовать их комбинацию в секунды   -  person stack_user60    schedule 26.11.2019
comment
Типы данных java.xml несколько устарели, по крайней мере, Duration. Я думаю, вы будете счастливее работать с классом java.time.Duration, который вместо этого упомянул @deHaar.   -  person Ole V.V.    schedule 26.11.2019
comment
getSeconds() возвращает все, что вы передаете как секунды в конструкторе, поэтому здесь вы передаете 0, поэтому он возвращает 0   -  person Bentaye    schedule 26.11.2019


Ответы (5)


JavaDocs для javax.xml.datatype.Duration.getSeconds() сказать

Получает значение поля SECONDS в виде целого числа или 0, если оно отсутствует. Этот метод работает так же, как getYears(), за исключением того, что этот метод работает с полем SECONDS.

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

private static int getInSeconds(javax.xml.datatype.Duration duration) {
    int totalSeconds = 0;
    totalSeconds += duration.getSeconds();
    totalSeconds += (duration.getMinutes() * 60);
    totalSeconds += (duration.getHours() * 60 * 60);
    totalSeconds += (duration.getDays() * 24 * 60 * 60);
    // ... calculate values for other fields here, too
    return totalSeconds;
}

Для определенных периодов int будет недостаточно, имейте это в виду, пожалуйста.

Рассмотрите возможность использования вместо этого java.time.Duration, если возможно.

Существует бэкпорт java.time для Java 6 и 7, но, к сожалению, не для более ранних версий.

person deHaar    schedule 26.11.2019
comment
это сработало Спасибо. Я не могу использовать java.time.Duration, так как я должен использовать jdk6 - person stack_user60; 26.11.2019
comment
@stack_user60 нет проблем, вы можете использовать бэкпорт, посмотрите отредактированный ответ или ответ Оле В.В. - person deHaar; 26.11.2019

Насколько я вижу ваш код, который вы пытаетесь использовать

javax.xml.datatype.Duration

который, я думаю, вернет только указанную продолжительность в секундах. Если вы хотите получить количество секунд за предоставленную продолжительность времени, вам нужно использовать

java.time.Duration

Существует Доступен метод parse, который позволяет вам анализировать CharSequence и получать правильный экземпляр java.time.Duration, что можно сделать, как показано ниже.

String toParse = "P"+days+"DT"+hours+"H"+minutes+"M";
Duration secondsDuration = Duration.parse(toParse);
System.out.println(secondsDuration.getSeconds());

Это пример кода, который вы можете прочитать в дополнительной документации для данного метода доступны различные методы для java.time.Duration.

person DevX    schedule 26.11.2019

java.time и бэкпорт ThreeTen

Я думаю, вам больше понравится org.threeten.bp.Duration из бэкпорта java.time в Java 6 и 7. java.time — это современный API даты и времени Java, изначально представленный в Java 8.

    int days = 4;
    int hours = 3;
    int minutes = 20;

    Duration duration = Duration.ofDays(days).plusHours(hours).plusMinutes(minutes);
    long totalSeconds = duration.getSeconds();

Ссылка: ThreeTen Backport

person Ole V.V.    schedule 26.11.2019

По сути, ваша продолжительность составляет часы = 3, дни = 4, минуты = 20 и секунды = 0. вот почему, когда вы пытаетесь получить секунды, вы получаете 0. Если вы хотите преобразовать всю продолжительность в секунды, добавьте дни * 24 * 60 * 60 + часы * 60 * 60 + минуты * 60 + секунды.

В Java 8 гораздо лучше поддерживается Duration. Пожалуйста, пройдите через https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html

person Syam Dorjee    schedule 26.11.2019

Ответы deHaar, DevX и Оле В.В. верны и направляют вас в правильном направлении.

Если вы хотите придерживаться javax.xml.datatype.Duration, есть простой способ, используя только OOTB (Out-Of-The-Box) API, чтобы достичь того, чего вы хотите. Это так же просто, как передать экземпляр java.util.Calendar в javax.xml.datatype.Duration#getTimeInMillis и преобразование возвращаемого значения в секунды с помощью TimeUnit.MILLISECONDS.toSeconds.

Демонстрация:

import java.util.Calendar;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;

public class Main {
    public static void main(String[] args) throws DatatypeConfigurationException {
        Integer hours = 3, days = 4, minutes = 20;
        javax.xml.datatype.Duration duration = DatatypeFactory.newInstance().newDuration(true, 0, 0, 
                            days, 
                            hours,
                            minutes, 
                            0);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
        long seconds = TimeUnit.MILLISECONDS.toSeconds(duration.getTimeInMillis(calendar));
        System.out.println(seconds);
    }
}

Вывод:

357600
person Arvind Kumar Avinash    schedule 31.12.2020
comment
Угловой случай: duration.getTimeInMillis(calendar) учитывает переходы на летнее время в календаре. При использовании Calendar от 26 марта 2021 года в моем часовом поясе (Европа/Копенгаген) я получаю только 354000, потому что 28 марта длится всего 23 часа. Если вы хотите, чтобы в сутках всегда было 24 часа, один из способов обеспечить это — использовать Calendar в формате UTC, например GregorianCalendar.from(ZonedDateTime.now(ZoneOffset.UTC)). - person Ole V.V.; 31.12.2020
comment
@ОлеВ.В. - Еще раз спасибо за еще одно ценное предложение. Поскольку OP хочет придерживаться Java-6 без использования какого-либо API для резервного копирования, я добавил часовой пояс как calendar.setTimeZone(TimeZone.getTimeZone("GMT")). Я также проверил его на дату, которую вы упомянули, и он работает так, как ожидалось. - person Arvind Kumar Avinash; 31.12.2020