2

测验持续时间以整数形式指定为天、小时和分钟。

我正在尝试将这些组合转换为秒。下面的代码我试过了。但它总是返回 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

请指导。

4

6 回答 6

2

据我所知,您尝试使用的代码

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 的不同方法。

于 2019-11-26T11:10:50.443 回答
1

JavaDocsjavax.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;
}

对于某些持续时间,aint是不够的,请记住这一点。

java.time.Duration如果可能,请考虑改用。

Java 6 和 7有一个backportjava.time,但不幸的是,下面没有。

于 2019-11-26T11:05:25.460 回答
1

java.time 和 ThreeTen Backport

我想你会更喜欢org.threeten.bp.Duration从 java.time 到 Java 6 和 7 的向后移植。java.time 是最初在 Java 8 中引入的现代 Java 日期和时间 API。

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

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

链接:ThreeTen Backport

于 2019-11-26T11:19:16.523 回答
0

deHaarDevXOle VV的答案是正确的,并引导您朝着正确的方向前进。

如果你想坚持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
于 2020-12-31T00:08:53.390 回答
0

基本上,您的持续时间是小时 = 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

于 2019-11-26T11:13:06.637 回答
-1
import java.util.concurrent.TimeUnit;
import java.util.*;

final class TimeConverter {
    public static void main(String[] args) {

        Scanner userInput = new Scanner(System.in);

        System.out.print(" [ d = Day/s, h = Hour/s, m = Minute/s, s = Second/s, ss = Milli/s ]\n\n Mode: ");

        String selectMode = userInput.nextLine().toLowerCase().trim();

        try {

            if (selectMode.equals("d")) {

                System.out.print(" Day/s: ");
                Long days = userInput.nextLong();

                System.out.println("\n  Hour/s: " + TimeUnit.DAYS.toHours(days) + ".hr/s");
                System.out.println("  Minute/s: " + TimeUnit.DAYS.toMinutes(days) + ".min/s");
                System.out.println("  Second/s: " + TimeUnit.DAYS.toSeconds(days) + ".sec/s");
                System.out.println("  Milli-Second/s: " + TimeUnit.DAYS.toMillis(days) + ".milli/s");

            } else if (selectMode.equals("h")) {

                System.out.print(" Hour/s: ");
                Long hours = userInput.nextLong();

                System.out.println("\n  Day/s: " + TimeUnit.HOURS.toDays(hours) + ".day/s");
                System.out.println("  Minutes/s: " + TimeUnit.HOURS.toMinutes(hours) + ".min/s");
                System.out.println("  Second/s: " + TimeUnit.HOURS.toSeconds(hours) + ".sec/s");
                System.out.println("  Milli-Second/s: " + TimeUnit.HOURS.toMillis(hours) + ".milli/s");

            } else if (selectMode.equals("m")) {

                System.out.print(" Minute/s: ");
                Long minutes = userInput.nextLong();

                System.out.println("\n  Day/s: " + TimeUnit.MINUTES.toDays(minutes) + ".day/s");
                System.out.println("  Hour/s: " + TimeUnit.MINUTES.toHours(minutes) + ".hr/s");
                System.out.println("  Second/s: " + TimeUnit.MINUTES.toSeconds(minutes) + ".sec/s");
                System.out.println("  Milli-Second/s: " + TimeUnit.MINUTES.toMillis(minutes) + ".milli/s");

            } else if (selectMode.equals("s")) {

                System.out.print(" Second/s: ");
                Long seconds = userInput.nextLong();

                System.out.println("\n  Day/s: " + TimeUnit.SECONDS.toDays(seconds) + ".day/s");
                System.out.println("  Hour/s: " + TimeUnit.SECONDS.toHours(seconds) + ".hr/s");
                System.out.println("  Minute/s: " + TimeUnit.SECONDS.toMinutes(seconds) + ".min/s");
                System.out.println("  Milli-Second/s: " + TimeUnit.SECONDS.toMillis(seconds) + ".milli/s");

            } else if (selectMode.equals("ss")) {

                System.out.print(" Milli-Second/s: ");
                Long millis = userInput.nextLong();

                System.out.println("\n  Day/s: " + TimeUnit.MILLISECONDS.toDays(millis) + ".day/s");
                System.out.println("  Hour/s: " + TimeUnit.MILLISECONDS.toHours(millis) + ".hr/s");
                System.out.println("  Minute/s: " + TimeUnit.MILLISECONDS.toMinutes(millis) + ".min/s");
                System.out.println("  Second/s: " + TimeUnit.MILLISECONDS.toSeconds(millis) + ".sec/s");
                System.out.println("  Nano-Second/s: " + TimeUnit.MILLISECONDS.toNanos(millis) + ".nano/s");

            } else {

                System.out.println(" \"" + selectMode + "\" is not a valid mode. Please try again.\n");
                TimeConverter.main(args);

            }
        } catch (InputMismatchException error) {

            System.out.println(" Please enter numbers only.\n");
            TimeConverter.main(args);

        } catch (Exception error) {

            System.out.println(" Something went wrong. Please try again.\n");
            TimeConverter.main(args);

        }
    }
}
于 2021-11-17T06:57:34.640 回答