我需要转换以毫秒为单位的持续时间=>类型 javax.xml.datatype.Duration
. 这种类型的问题是,它使用年和月作为字段(其持续时间取决于当前的时间戳)。
也就是说,我想让 javax.xml.datatype.Duration
只包含天(编辑:当然,也包括小时,分钟,…)。可能是这样的:
private static Duration millis2Duration(final long millis) throws DatatypeConfigurationException {
Duration duration = DatatypeFactory.newInstance().newDuration(millis);
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis(0);
return duration.normalizeWith(cal);
}
但是,为了使持续时间正常化而创建日历似乎有些奇怪。是我遗漏了什么,还是这是最好的转换方式?
2条答案
按热度按时间knsnq2tg1#
当需要javax.xml.datatype.duration时,也可以使用java.time
我明确要求javax.xml.datatype。我无法选择其他数据类型。
从
java.time.Duration
到javax.xml.datatype.Duration
满足你的要求可能不是很简单,但我还是喜欢它作为最容易理解和最安全的方式来获得你想要的。此代码段的输出是:
p244dt4h46m5.432s型
我喜欢这段代码的地方在于,它明确地使用了天、小时、分钟和秒,包括java.time duration中秒的分数,并构建了一个没有年和月的xml duration。
一些麻烦来自于这样一个事实:将一小部分秒传递给工厂方法的唯一方法是通过
BigInteger
以及BigDecimal
. 所以我首先构造一个BigDecimal
保持秒和秒的分数。这个
toHoursPart
,toMinutesPart
以及toSecondsPart
我正在使用的方法是在Java9中添加的。链接
oracle教程:date time解释如何使用java.time。
pxiryf3j2#
热释光;博士
避免遗留日期时间类型
您正在使用可怕的日期时间类,这些类在几年前被现代的java.time类所取代。从不使用
Calendar
,GregorianCalendar
,java.util.Date
,等等。java.time.duration文件
使用
java.time.Duration
而不是javax.xml.datatype.Duration
.显然,你想要一个通用的24小时不考虑日期天计数。这个
java.time.Duration
班级可以给你这个。无需创建自己的正式方法。无论您需要什么,只要使用:
关于java.time
java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如
java.util.Date
,Calendar
, &SimpleDateFormat
.要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
现在处于维护模式的joda time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线
java.sql.*
班级。hibernate5和jpa2.2支持java.time。从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9带来了一些小的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android(26+)的更高版本捆绑了java.time类的实现。
对于早期的android(<26),一个称为api desugaring的过程带来了java.time功能的一个子集,这些功能最初没有内置到android中。
如果desugaring不能提供您所需要的,那么threetenabp项目将threeten backport(如上所述)改编为android。了解如何使用threetenabp…。