使用JodaTime / java.time将浮点秒数转换为毫秒

时间:2018-07-10 18:53:18

标签: java jodatime

我正在调用的API返回的持续时间为小数秒:

double seconds = someOtherApi.getDuration();

要将其转换为毫秒,我们可以 执行:

long millis = (long) (seconds * 1000);

但是,我们在代码库中使用JodaTime,并且希望将任何类型的转换工作留给库。不幸的是,我在JodaTime中没有看到采用double的适当工厂方法。

是否存在“适当”的方法将持续时间的小数部分转换为Joda Duration,还是手动执行此操作是最佳选择?

1 个答案:

答案 0 :(得分:0)

您需要注册一个转换器。创建一个实现DurationConverter接口的类,并向ConverterManager注册。

这是一个示例(我在JodaTime 2.10上进行了测试):

转换器代码:

import org.joda.time.convert.DurationConverter;

public class DurationConverterFromDouble implements DurationConverter {

    @Override
    public Class<?> getSupportedType() {
        return Double.class;
    }

    @Override
    public long getDurationMillis(Object objectDouble) {
        return (int)(((double)objectDouble) * 1000);
    }
}

代码:

// register the converter
ConverterManager.getInstance().addDurationConverter(new DurationConverterFromDouble());

// create Duration from a double:
double d = 3.14;
Duration jodaDuration = new Duration(d);
System.out.println("Joda duration is " + jodaDuration);
System.out.println("Joda duration in milliseconds is " + jodaDuration.getMillis());

输出:

Joda duration is PT3.140S
Joda duration in milliseconds is 3140

有趣的是,NodaTime(C#的等效库)不需要使用转换器直接从double创建持续时间。我启动了一个新的C#控制台项目,下载了NodaTime 2.3.0,通过智能感知(自动完成)使用了该API,并找到了以下解决方案:

代码:

double d = 3.14;
var nodaDuration = Duration.FromSeconds(d);
Console.WriteLine("Noda duration is " + nodaDuration);
Console.WriteLine("Noda duration in milliseconds is " + nodaDuration.TotalMilliseconds);

输出:

Noda duration is 0:00:00:03.14
Noda duration in milliseconds is 3140