在 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
deHaar、DevX 和 Ole 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
测验持续时间指定为天数、小时数和分钟数,均为整数。
我正在尝试将这些的组合转换为秒。下面的代码我试过了。但它总是 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
deHaar、DevX 和 Ole 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