我有一个包含毫秒的javax.xml.datatype.Duration,例如1.5毫秒(1500微秒)的持续时间:
Duration duration = DatatypeFactory.newInstance().newDuration("PT0.0015S");我需要以纳秒为单位获取这个值,但是Duration提供的最小时间单位似乎是getTimeInMillis,它返回一个long并剪切任何小于1毫秒的值。
如何获取以纳秒为单位的持续时间?
发布于 2020-01-28 22:02:26
您可以将持续时间解析为java.time.Duration。然后调用toNanos()方法。
Duration duration = DatatypeFactory.newInstance().newDuration("PT0.0015S");
java.time.Duration.parse(duration.toString()).toNanos();发布于 2020-01-28 21:48:41
持续时间API在这里让我有点惊讶,因为您必须使用Duration.getField(Field)获取持续时间的秒数部分。该方法返回一个Number,它可以是一个BigInteger (表示天、小时、分钟。等)或BigDecimal (仅用于几秒钟)。
因此,要获得一秒的分数,可以使用getField(DatatypeConstants.SECONDS),然后转换值:
Duration duration = DatatypeFactory.newInstance().newDuration("PT0.0015S");
BigDecimal seconds = (BigDecimal) duration.getField(DatatypeConstants.SECONDS);
// Note that `getField` will return `null` if the field is not defined.
if(seconds != null) {
System.out.println(seconds + "s"); // 0.0015s
System.out.println(seconds.movePointRight(9) + "ns"); // 1500000ns
},但这不是持续时间的总秒数。,这只是秒数字段的值,其他字段将被忽略。对于像P1M0.0015这样的持续时间(1分钟零1.5毫秒),这将忽略分钟,只返回1.5ms。
将持续时间的所有其他字段转换为秒并将其相加将起作用。或者使用getTimeInMillis,它返回持续时间的总毫秒数:
Duration duration = DatatypeFactory.newInstance().newDuration("PT1M0.0015S");
BigDecimal seconds = (BigDecimal) duration.getField(DatatypeConstants.SECONDS);
// only keep the fractional part
BigDecimal fractionalSeconds = seconds.remainder(BigDecimal.ONE);
long totalMillis = duration.getTimeInMillis(new Date(0));
// convert total millis to whole seconds (removes fractional part)
BigDecimal totalIntegerSeconds =
new BigDecimal(totalMillis).movePointLeft(3).setScale(0, RoundingMode.FLOOR);
// add both to get total seconds
BigDecimal totalSeconds = totalIntegerSeconds.add(fractionalSeconds);
System.out.println(totalSeconds + "s"); // 60.0015s
System.out.println(totalSeconds.movePointRight(9) + "ns"); // 60001500000ns这看起来很有效,但是太复杂了。肯定有一种更简单的方法来做到这一点。
如果你使用的是Java1.8,@hasnae's answer解决方案看起来会更好。我想知道,由于java.time.Duration比javax.xml.datatype.Duration晚引入多年,所以API设计者想要获得纳秒精度的方法是什么。
https://stackoverflow.com/questions/59950271
复制相似问题