在 Java 中将天、分钟、小时转换为秒,使用 Duration 对象失败

Convert days, minutes, hours to seconds in Java Using Duration object failing

测验持续时间指定为天数、小时数和分钟数,均为整数。

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

Please guide.

JavaDocs for javax.xml.datatype.Duration.getSeconds()

Obtains the value of the SECONDS field as an integer value, or 0 if not present. This method works just like getYears() except that this method works on the SECONDS field.

如果你想计算这个持续时间代表的总秒数,你将不得不自己计算它们,也许是这样(可能有更好的解决方案):

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 6 和 7 有一个 backport of java.time,但不幸的是,下面没有。

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

javax.xml.datatype.Duration

我只相信 return 指定的持续时间(以秒为单位)。如果你想在提供的时间内获得秒数,你需要使用

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());

这是一个示例代码,您可以进一步阅读 documentation 给定方法和 java.time.Duration 可用的不同方法。

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

java.time 和 ThreeTen 向后移植

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

中引入
    int days = 4;
    int hours = 3;
    int minutes = 20;

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

Link: ThreeTen Backport

deHaarDevXOle V.V. 的答案是纠正并指导你正确的方向。

如果你想坚持javax.xml.datatype.Duration,有一个简单的方法,纯粹使用 OOTB(开箱即用)API,来实现你想要的。就像将 java.util.Calendar 实例传递给 javax.xml.datatype.Duration#getTimeInMillis and converting the returned value to seconds by using 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