[英]Convert time duration (BigDecimal value + time units) to milliseconds long
我必须创建一个具有2个输入参数的函数:BigDecimal中的Time duration
(精度38,小数TimeUnitsType enum
6)和TimeUnitsType enum
(DAYS,HOURS,MINUTES或SECONDS)。
结果,我需要获取long
值(毫秒); 据我了解, BigDecimal
的longValue()
方法在此处无法正确工作,因为它将scale设置为0,并且longValueExact()
会抛出ArithmeticException("Overflow")
(因为精度longValueExact()
> 19)
public static long convertTimeToMillis(BigDecimal time, TimeUnitsType timeUnitsType) {
long timeLong = time.longValue();
switch (timeUnitsType) {
case DAYS:
return TimeUnit.DAYS.toMillis(timeLong);
case HOURS:
return TimeUnit.HOURS.toMillis(timeLong);
case MINUTES:
return TimeUnit.MINUTES.toMillis(timeLong);
default:
return TimeUnit.SECONDS.toMillis(timeLong);
}
}
因此,我需要针对每种情况分别进行单独的计算。 你能帮我么? BigDecimal操作使我有些害怕,因为我以前从未与他们合作过:)并且在其余任务中都要求精度。
PS Java版本为1.6
如果time
以timeUnitsType
为单位,并且您正在将该时间(以其单位)转换为毫秒,那么总会有溢出的机会。 long
根本不能容纳超过19位数字 ,而在这里您可以拥有32位数字(以秒为单位)为6个小数位,并将其转换为毫秒将使其最多为35位数字。 32位数字天到毫秒甚至更糟...
你确定你需要将其转换BigDecimal
在其TimeUnit
到一个long
以毫秒为单位?
如果丢失任何信息, BigDecimal.longValueExact()
将引发异常。 因此,如果您检查并处理该异常,那么我想一切都会好的。
有一个原因,您允许在输入值中最多允许6个小数位,因此不能仅仅忽略它们。 自己进行转换,创建一个保留小数位的新BigDecimal。 一旦有了毫秒,就将BigDecimal舍入。 最后,将BigDecimal与Long.MAX_VALUE和MIN_VALUE进行比较。 如果超出这些范围,则引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.