首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将时间持续时间(BigDecimal值+时间单位)转换为毫秒长

将时间持续时间(BigDecimal值+时间单位)转换为毫秒长
EN

Stack Overflow用户
提问于 2017-12-06 13:50:30
回答 2查看 1.7K关注 0票数 0

我必须创建一个包含两个输入参数的函数:Time duration in BigDecimal (精度38,scale 6)和TimeUnitsType enum (天、小时、分钟或秒)。

因此,我需要得到long值(毫秒);据我所知,BigDecimallongValue()方法在这里不能精确地工作,因为它将标度设置为0,而longValueExact()将抛出ArithmeticException("Overflow") (因为精度比例尺> 19)。

代码语言:javascript
复制
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操作让我有点害怕,因为我以前还没有使用过它们:),其余的任务都需要精确性。

P.S.Java版本为1.6

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-06 14:20:52

如果time位于timeUnitsType的单位中,并且您将该时间(单位)转换为毫秒,则始终存在溢出的可能性。long不能容纳超过19位数字,而在这里,您可以有32位数字--6位小数位数--并将其转换为毫秒,将其转换为35位数字。32位数天到毫秒更糟..。

您确定需要以毫秒为单位将此BigDecimal在其TimeUnit中转换为单个long吗?

如果有任何信息丢失,BigDecimal.longValueExact()将抛出异常。所以如果你检查这个异常并处理它,我想一切都会好起来的。

票数 2
EN

Stack Overflow用户

发布于 2017-12-06 14:29:06

有一个原因是,您允许在传入值中最多有6个小数位,所以您不能忽略它们。自己进行转换,创建一个保留十进制位置的新BigDecimal。一旦您有毫秒时间,绕过该BigDecimal。最后,将BigDecimal与Long.MAX_VALUE和MIN_VALUE进行比较。如果它超出了这些界限,抛出一个异常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47675939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档