将毫秒转换为标准化的javax.xml.datatype.duration

cetgtptt  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(393)

我需要转换以毫秒为单位的持续时间=>类型 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);
}

但是,为了使持续时间正常化而创建日历似乎有些奇怪。是我遗漏了什么,还是这是最好的转换方式?

knsnq2tg

knsnq2tg1#

当需要javax.xml.datatype.duration时,也可以使用java.time

我明确要求javax.xml.datatype。我无法选择其他数据类型。
java.time.Durationjavax.xml.datatype.Duration 满足你的要求可能不是很简单,但我还是喜欢它作为最容易理解和最安全的方式来获得你想要的。

long millis = 21_098_765_432L;

    boolean positive = millis > 0;
    java.time.Duration javaTimeDuration = java.time.Duration.ofMillis(millis);
    if (! positive) {
        javaTimeDuration = javaTimeDuration.negated();
    }
    BigDecimal seconds = BigDecimal.valueOf(javaTimeDuration.toSecondsPart())
            .add(BigDecimal.valueOf(javaTimeDuration.getNano(), 9))
            .stripTrailingZeros();
    Duration dur = DatatypeFactory.newInstance().newDuration(
            positive,
            null,
            null,
            BigInteger.valueOf(javaTimeDuration.toDays()),
            BigInteger.valueOf(javaTimeDuration.toHoursPart()),
            BigInteger.valueOf(javaTimeDuration.toMinutesPart()),
            seconds);

    System.out.println(dur);

此代码段的输出是:
p244dt4h46m5.432s型
我喜欢这段代码的地方在于,它明确地使用了天、小时、分钟和秒,包括java.time duration中秒的分数,并构建了一个没有年和月的xml duration。
一些麻烦来自于这样一个事实:将一小部分秒传递给工厂方法的唯一方法是通过 BigInteger 以及 BigDecimal . 所以我首先构造一个 BigDecimal 保持秒和秒的分数。
这个 toHoursPart , toMinutesPart 以及 toSecondsPart 我正在使用的方法是在Java9中添加的。

链接

oracle教程:date time解释如何使用java.time。

pxiryf3j

pxiryf3j2#

热释光;博士

java.time.Duration.ofMillis( m ).toDaysPart()

避免遗留日期时间类型

您正在使用可怕的日期时间类,这些类在几年前被现代的java.time类所取代。从不使用 Calendar , GregorianCalendar , java.util.Date ,等等。

java.time.duration文件

使用 java.time.Duration 而不是 javax.xml.datatype.Duration .

Duration duration = Duration.ofMillis( yourCountOfMillisecondsGoesHere ) ;

显然,你想要一个通用的24小时不考虑日期天计数。这个 java.time.Duration 班级可以给你这个。

long countOf24HourDays = duration.toDaysPart() ;

无需创建自己的正式方法。无论您需要什么,只要使用:

Duration.ofMillis( m ).toDaysPart()

关于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…。

相关问题